日期加減計算器
從指定日期加減天數、週數、月數、年數
從日期加減天數
什麼是日期加減計算器?
日期加減計算器用來從一個起始日期往前或往後推算目標日期,可依天、週、月、年進行加減。它常用於續約提醒、合約到期、回訪安排、保固期限、專案排程與紀念日推算,避免人工翻日曆時漏算。日期加減看似簡單,真正麻煩的是日曆本身並不規則:每個月天數不同,閏年會影響二月,1 月 31 日加 1 個月也可能沒有對應日期。此工具適合快速得到清楚的日曆結果。它計算的是自然日曆時間,不會自動排除週末、國定假日、補班日或法律條款中的特殊截止規則。
使用方法
使用說明
- 輸入開始日期
- 選擇「加」(往前)或「減」(往後)
- 輸入數值並選擇單位(日/週/月/年)
- 點選「計算結果」檢視目標日期
日期計算規則
- 月份與年份的計算結果可能落在較短的月份;請確認您的業務規則如何處理 1 月 31 日加一個月這類情況。
- 對於截止日期,請先確認週末、假日或當日截止時間是否會影響最終日期。
使用場景
技術原理
本工具的日期運算基於 ECMAScript Date 物件所實作的格里曆(proleptic Gregorian calendar)。JavaScript 中的月份以 0 為起始索引(1 月為 0,12 月為 11),這是日期程式碼中最常見的偏移一錯誤來源。日期加減很簡單:new Date(d.getTime() + n * 86_400_000)。月份加減則較為複雜,因為月份有 28、29、30 或 31 天:標準寫法 date.setMonth(date.getMonth() + n) 當結果月份比來源日期短時會溢位,因此 1 月 31 日加 1 個月會得到 3 月 3 日而非 2 月 28 日(引擎會將多出的 3 天結轉到 3 月)。本工具透過在 setMonth 之後比較 date.getMonth() 來偵測溢位,必要時將日期限制在目標月份的最後一天,與 moment.js、date-fns 及 Temporal 的 Plain Date.add() 行為一致。 閏年遵循標準格里曆規則:能被 4 整除的年份為閏年,但世紀年必須同時能被 400 整除。因此 1900 年和 2100 年為平年,而 2000 年為閏年,2024 年亦然。當計算跨越 2 月 29 日時這點很重要:2023 年 1 月 29 日加 1 個月再加 1 個月得到 3 月 29 日,但在 2024 年進位會落在 2 月 29 日(有效日期)再得到 3 月 29 日,無需限制日期。1582 年儒略曆轉格里曆的分界點在此被忽略,因為格里曆向前無限延伸規則;1582 年 10 月 15 日之前的日期在技術上雖有時代錯置,但對現代用途仍能正確計算。 時區處理是另一個維度:Date 內部儲存 UTC 時刻,僅在呼叫 .getDate()、.getMonth() 或 .toLocaleString() 時才套用主機系統的 IANA 時區(如 America/New_York、Asia/Shanghai)。兩個陷阱:(1) 從不含 Z 後綴的 ISO 字串("2026-06-10")建立的日期會被解析為 UTC 午夜,但 "2026-06-10T00:00:00" 不含 Z 會被解析為本地時間午夜,同一日期的 getDate() 根據使用者的偏移量可能傳回 9 或 10;(2) 春季夏令時間轉換(跳過 02:00-03:00)和秋季(重複 01:00-02:00)使某些運算產生歧義,因此「+24 小時」的加法可能落在實際時鐘的 23 或 25 小時之後。對於工作日、僅限平日或考慮假日的運算,此處的日曆結果必須對照特定地區的假日清單進行後處理(例如透過 date-holidays npm 套件或自訂行事曆),而非依賴簡單的進位。
- JS Date 月份以 0 為索引:1 月 = 0,12 月 = 11;偏移一是最常見的錯誤。
- setMonth 溢位:1 月 31 日加 1 個月得到 3 月 3 日而非 2 月 28 日;本工具透過在 setMonth 後比較 getMonth() 來限制至月底。
- 閏年:能被 4 整除,但世紀年必須能被 400 整除(因此 1900 年否,2000 年是,2024 年是)。
- 不含 Z 的 ISO 8601("2026-06-10T00:00:00")解析為本地時間;含 Z 則為 UTC——getDate() 可能傳回不同日期。
- 夏令時間轉換會產生 23 小時和 25 小時的日子;+24 小時不等於 +1 個日曆日。
- 天數運算透過 getTime() + n * 86_400_000 精確計算;較長單位透過 setMonth/setFullYear 級聯並限制日期。
- 工作日和假日感知運算必須透過特定地區的行事曆表在上層疊加——不在引擎本身。
範例
起始日加 90 天(試用期 / OKR 檢視)
起始日期 :2026-01-15(星期四)
操作 :+ 90 天
結果 :2026-04-15(星期三)
適用情境 :90 天試用期結束、Q1 OKR 檢視今日往前推 6 個月
起始日期 :2026-06-11
操作 :- 6 個月
結果 :2025-12-11
適用情境 :回溯半年作續約或流失分析加 2 年 3 個月 5 天(簽證到期)
起始日期 :2026-01-15
步驟 1 :+ 2 年 -> 2028-01-15
步驟 2 :+ 3 個月 -> 2028-04-15
步驟 3 :+ 5 天 -> 2028-04-20
結果 :2028-04-20月底進位:1 月 31 日加 1 個月
起始日期 :2026-01-31
操作 :+ 1 個月
結果 :2026-02-28(2026 年 2 月只有 28 天)
閏年檢查:
起始日期 :2028-01-31
操作 :+ 1 個月
結果 :2028-02-29(2028 年是閏年)提前 14 天的帳單提醒
訂閱續約日 :2026-07-01
操作 :- 14 天
寄送提醒於 :2026-06-17常見問題
對月底日期加「月份」是怎麼運作的?
由於每個月天數不同,對 1 月 31 日加 1 個月會產生歧義。本計算器遵循標準慣例:截到目標月份的最後一天 — 1 月 31 日 + 1 個月 = 2 月 28 日(閏年為 29 日)。這與 Excel 的 EDATE 函式行為一致。
會計算週末和假日嗎?
預設會 — 「加 5 天」就是加 5 個日曆天。若需要計算工作日(跳過週末並可選擇排除假日),請使用專用的「工作日計算器」工具;本頁僅處理純日曆運算。
可以同時加上年、月、週、日嗎?
可以。結果會依照年 → 月 → 週 → 日的順序套用,這也是大多數日期函式庫(包括 JavaScript Temporal 提案)採用的慣例。順序很重要:對 1 月 1 日加上「1 個月又 30 天」與「30 天又 1 個月」會落在不同日期。
如何處理日光節約時間(DST)?
計算以日曆日期為準,而非絕對時間,因此跨越 DST 轉換加「一天」後,當地時區的時刻仍然相同。如果需要精確到 24 小時的運算,請將單位改為小時而不是天。
支援的日期範圍是多少?
JavaScript Date 涵蓋從 1970 年起 ±100,000,000 天,大約是公元前 271,821 年到公元 275,760 年。本計算器可以處理該範圍內任何歷史或遠未來的日期。1582 年葛利果曆改革之前的日期,請注意當地民曆可能不同。
為什麼日期相減和加上負數天數的結果不一樣?
其實是一樣的 — 減 N 天等同於加 -N 天。如果你想求兩個日期之間的差距,請使用「日期差計算器」工具。本頁是單向運算:起始日期加上或減去一段時間長度。
我的資料會被上傳嗎?
不會。計算在你的瀏覽器中執行。重新整理頁面後輸入會被清除。