日期相差幾天
計算兩個日期之間相差的天數、週數、年月日與工作日,並說明造成差一天的「含頭含尾」問題。
在你的瀏覽器中執行
工作日計算的是中間經過的平日,不含結束當日,也未扣除國定假日。
含不含頭尾
這是任何日期差都必須先回答的問題,也是兩個計算器會差一天的原因。
從 8 月 3 日到 8 月 10 日:
| 算法 | 答案 | 意思 |
|---|---|---|
| 不含尾——經過的天數 | 7 | 中間隔了幾晚,也就是間隔多長 |
| 含頭含尾——涉及的日期數 | 8 | 這個區間包含幾個日期 |
本頁算的是經過的天數:答案是 7,因為兩個日期之間經過了 7 天。這是「相差幾天」的一般含意, 也是所有程式語言的日期運算給出的結果。
會出問題的是規則本身用另一種算法寫的時候。住宿、租借與部分契約預告期是含頭含尾計算的——「7 晚」 的訂房跨越 8 個日期——所以在相信任何一個數字之前,先確認規則指的是哪一種。
年、月、日
這個拆解是曆法運算,不是除法。從 2020 年 1 月 15 日到 2026 年 8 月 7 日是 6 年 6 個月又 23 天,而這三個部分會剛好加回到目標日期,因為每一部分都是從前一部分落點 開始量的。
它不是 2396 ÷ 365。這裡的「月」是 28 到 31 天的真實曆月,所以:
- 同樣的天數,會因為跨過哪幾個月而換算成不同的月數。
- 把各部分以不同順序加回去,可能得到不同的日期。從 1 月起算「六個月又 23 天」,和「23 天又 六個月」不是同一天。
這兩件事就是各家日期函式庫互相不一致的原因,也是任何牽涉法律或金錢的文件都會自己寫明計算慣例、 而不依賴某一套實作的原因。
工作日
這裡算的是中間經過的平日,不含結束當日。從星期一到下個星期一是 5 天。
有兩個限制值得講明:
- 沒有扣除國定假日。 假日因地而異,而且每年都在移動——農曆春節、復活節,以及每一個補假 ——所以一個宣稱能處理假日的通用計算器,對大多數使用者來說都會是錯的。
- 預設一週工作日為週一到週五。 這並非放諸四海皆準。
真正重要的期限,請對照該地區的行事曆計算,不要只看這個數字。
週
以整週加上剩餘天數表示,因為那才是人腦記住一段時間的方式。100 天是 14 週又 2 天。
要注意一年是 52 週又 1 天,不是 52 週——這就是為什麼「每四週」發一次的薪水一年會發十三次。見 天數轉週數。
閏年與 2 月 29 日
因為計算是以曆法日期而不是固定年長度進行的,所以這些都處理得了。2024 年有 366 天,跨過 2 月 29 日的區間會比一年後的同一段長一天。
2 月 29 日在平年沒有對應日。這裡採用的慣例——也是多數司法管轄區在法律上採用的——是落在 3 月 1 日。
時區與日光節約
兩者都不影響答案。這裡處理的是曆法日期而不是時間點,所以即使某一天的時鐘撥動了一小時,那一天 仍然是一天。用毫秒去做同樣的計算,正是差一小時那類錯誤的來源,而這裡刻意不那樣做。