ToolAct工具行動

日期間隔計算器

計算兩個日期之間的天數、週數、月數、年數等

計算兩個日期之間的間隔

什麼是日期間隔計算器?

日期間隔計算器用來測量兩個日曆日期之間相差多久,並將結果換算成天數、週數、約等於幾個月、約等於幾年,以及小時、分鐘等單位。它適合核對專案週期、請假區間、帳期跨度、紀念日、資料儲存期限與歷史日期距離。要注意,日期間隔不一定等於「包含首尾兩天」的天數:例如 1 月 1 日到 1 月 3 日相差 2 天,除非業務規則要求兩端都算入。月份與年份通常只能近似,因為每個月長度不同。若涉及工作日、假日、時區或法律截止日,應依相應規則另行計算。

使用方法

使用說明

  1. 輸入開始日期
  2. 輸入結束日期
  3. 點選「計算間隔」以比較兩個日期
  4. 查看結果:天、週、月、年、時、分、秒

計算規則

  • 請確認您的任務需要的是排除端點的間隔,還是包含端點的計算;許多業務規則會將起訖日一併納入。
  • 處理跨時區工作時,請先將日期轉換為同一時區,特別是時數或分鐘數有影響的情況。

使用場景

精確測量兩個日期之間的天數差距選取開始和結束日期,計算以天為單位的間隔,並附帶週數、約等月數、約等年數、小時、分鐘和秒的額外總計。計算遵循公曆規則,因此 1900 年被視為平年,2000 年被視為閏年,這在任一端點接近 2 月 29 日時很重要。
檢查事件和記錄的經過時間適用於訂閱、服務期間、旅行跨度、專案時程、紀念日、學習連續天數,以及任何跨月手動計算容易出錯的記錄。將兩個來源日期與結果放在一起,以便日後檢查間隔,因為口述的「36 個月」比原始的起始和結束日期對更難稽核。
謹慎使用約等月數和年數主要結果是天數。月數和年數是近似摘要,因此帳單週期、法定年齡和合約規則應使用該情境所要求的特定規則。用約等值做方向參考,而非最終決策依據。ISO 週數(第 1 週包含該年第一個星期四)是另一種慣例,簡單的天數計算本身不會產生這個結果。
引用間隔前先決定包含或排除端點的計算方式對於請假區間和試用期,事先約定是否兩端都算入,然後將結果標示為「之間」或「跨越」,避免法務、人力資源和財務報告出現分歧。差一天在單一區間看起來微不足道,但當慣例未在各處統一應用時,會在人力資源、薪資和財務匯出中累積放大。
將約等月數與具體日曆交叉比對當帳單週期、試用期或保固期以月或年定義時,用日曆感知的規則跑同一對日期,確認約等值是否符合政策。在同一份報告中混用兩種單位是合約爭議的常見來源,特別是 B2B SaaS 續約中同一客戶同時使用 30 天方案和日曆月方案的情況。標示「從起始日起 12 個月」的週年條款通常指整整一個日曆年而非 365 天,因此 1 月 15 日起始應為隔年 1 月 15 日,而非 1 月 14 日或 16 日。

技術原理

精確天數差異透過 Math.floor((end.getTime() - start.getTime()) / 86_400_000) 計算,其中 86,400,000 是非夏令日 24 小時的毫秒數。這給出的是開區間結果——1 月 1 日到 1 月 3 日為 2 天而非 3 天——因為減法測量的是兩個時刻之間的跨度而非計算日曆格數。若需包含首尾兩端(兩端都計入),結果加 1;許多法律、請假和計費規則要求如此,偏移一是人力資源與財務報告之間最常見的分歧原因。週數即天數 / 7;頁面同時顯示小時 = 天數 * 24、分鐘 = 天數 * 1440、秒 = 天數 * 86,400 的衍生總數。 月份和年份差異刻意標示為「約」,因為日曆月份和年份長度不一。簡單方法是天數 / 30.436875(平均格里曆月份)和天數 / 365.2425(400 年格里曆週期的平均年份),適用於狀態報告和儀表板但不適用於合約。對於日曆精確的「X 個完整月份」,演算法先減去年份 × 12 + 月份分量,若結束日小於起始日則再減 1——這是大多數日期函式庫(date-fns differenceInMonths、dayjs $.diff('month')、Temporal Duration.from)的計算方式。年份計算有相同特性:2024-02-29 到 2025-02-28 有時被計為 1 年(限制至月底),有時為 0 年 11 個月 30 天,取決於慣例。 閏年遵循格里曆規則(能被 4 整除,但世紀年必須能被 400 整除,因此 1900 年 = 平年,2000 年 = 閏年,2024 年 = 閏年)。包含 2 月 29 日的跨度會自動多計一天,因為天數計算基於紀元以來的毫秒數而非日曆欄位。當兩個端點的時間精度低於一天時,時區處理至關重要:從本地時間字串建立的兩個 Date 值相減可能會有本地 UTC 偏移量的誤差,跨越夏令時間轉換的跨度可能是 23 或 25 小時而非標稱的 24 小時。Y2038 問題(Unix time_t 有符號 32 位元溢位於 2038-01-19T03:14:07Z)不會影響此頁面,因為 JavaScript Date 使用 64 位元浮點數,可表示紀元前後約一億天的日期,但以 32 位元 C 撰寫的下游系統仍需留意。

  • 精確天數 = Math.floor((end - start) / 86_400_000);每個非夏令日 8640 萬毫秒。
  • 結果預設為開區間:1 月 1 日到 1 月 3 日 = 2 天;加 1 即為包含首尾兩端的計數。
  • 約等月份使用平均 30.436875 天;年份使用格里曆 400 年週期的 365.2425 天。
  • 日曆精確月份差異:(y2-y1)*12 + (m2-m1),若結束日 < 起始日再減 1——與 date-fns differenceInMonths 一致。
  • 閏年:能被 4 整除,但世紀年必須能被 400 整除(1900 年否,2000 年是,2024 年是)。
  • 夏令時間轉換會產生 23 小時和 25 小時的日曆日;24 小時的減法可能不等於一個日曆日。
  • JavaScript Date 為 64 位元浮點數,不受 Unix Y2038(2038-01-19 03:14:07 UTC 的 32 位元 time_t 溢位)影響。

範例

完整兩個年度(2025-01-01 至 2026-12-31)

起始 :2025-01-01
結束 :2026-12-31

天數     :730
週數     :104.29
月數     :~24.00(約略)
年數     :~2.00(約略)
備註     :2028 年是範圍外的下一個閏年,若延伸到該年將涵蓋 2028-02-29。

短區間(3 天)

起始 :2026-06-11
結束 :2026-06-14

天數     :3
小時數  :72
分鐘數  :4320
秒數     :259200
含頭尾計算(兩端皆計入):4 天

跨年度的專案週期

起始 :2026-01-15(啟動)
結束 :2026-07-20(上線)

天數     :186
週數     :26.57
月數     :~6.16
適用情境 :進度報告、回顧、甘特圖摘要

以天數計算年齡

生日           :1995-03-15
今日           :2026-06-11

已活天數     :11,411
年數(約略):31.24
月數           :~374.9
當需要精確天數時很實用(例如紀念日里程碑)

時區陷阱(東京 vs 洛杉磯)

同一個日曆日期「2026-07-15」對應不同的真實時刻:
  Tokyo  (UTC+9)  -> 2026-07-15 00:00 = 2026-07-14 15:00 UTC
  Los Angeles (UTC-7) -> 2026-07-15 00:00 = 2026-07-15 07:00 UTC
若直接相減差距約 16 小時,足以讓 1 天的結果整個翻轉。
解法:相減前先將兩個日期轉換到同一個時區。

常見問題

兩個日期之間的差距是怎麼計算的?

採日曆運算:結果以「年、月、日」呈現,並另外給出總週、日、時、分、秒。年和月以週年為基礎(必須過了相同月日才會增加一年),天數則是兩個日期之間的日曆天數。

為什麼「年 + 月 + 日」加總起來不等於總天數?

因為一個月有 28 到 31 天。「1 年 2 個月又 5 天」的實際天數,會依其中各月份是 28、29、30 或 31 天而不同。「總天數」欄位採用純日曆運算,是最精確的數字。

起始日當天是計入還是排除?

本頁採排除起始日的演算法 — 同一天的差距顯示為 0 天。如果你需要「包含起始日」的演算法(例如住宿天數),請手動將結果加 1。

會排除週末或假日嗎?

不會。本頁計算每一個日曆天。若需計算工作日差距(跳過週末並可選擇排除假日),請使用「工作日計算器」工具。

為什麼跨越 DST 變更後時間部分看起來怪怪的?

時、分部分採用絕對時間,所以跨越日光節約時間轉換時,時間欄位會多出或少掉一小時。日數本身不受影響,因為日期差距是基於日曆計算的。

可比較的最大日期範圍是多少?

JavaScript Date 涵蓋從 Unix 紀元起 ±100,000,000 天,因此大約 ±271,000 年內的任何歷史或未來日期都能比對。1582 年之前的日期使用回推葛利果曆運算,這與當時實際使用的當地曆法不同。

計算是在本機完成的嗎?

是的。兩個日期與計算結果都留在你的瀏覽器中,不會上傳或記錄任何資料。