我曾經因為柵欄柱而退還給一位顧客 9 美元。我正在建造的 SaaS 進行了 14 天的試用,我的比例代碼計算為 "使用的天數"作為 endDate - startDate 以毫秒為單位,除以 86,400,000,四捨五入。 1 日晚上 11 點開始試用,15 日凌晨 1 點轉換,數學顯示 14 天 - 但客戶'心理模型說&引用;我第一天報名了,那'第一天,&引用;這使得第 15 天成為第 15 天。試用是 14 天還是 14 晚?我的程式碼和定價頁面彼此不一致,客戶在我之前就注意到了。
那'關於日期算術的事情:減法是微不足道的 定義 一切都出錯的地方。包容或排他性計數。是否&報價;一個月&報價;從 1 月 31 日起為 2 月 28 日、3 月 2 日或 3 月 3 日。無論是&報價;天&報價;是 24 小時,夏令時使一年中的某一天為 23 小時,另一天為 25 小時。其中每一天都至少咬過我一次,I'十多年來一直在運送 Laravel 和 React 應用程式。
一個 日期差異計算器 存在是為了精確地回答問題,以便您可以根據已知的正確結果檢查您的假設和程式碼。 toolz。dev 上的一個完全在您的瀏覽器中計算任意兩個日期之間的間隔(以天、週、月和年為單位)。我經常使用它:驗證發票期限、檢查合約期限、結算和報價;距離啟動和報價還有多少天; Slack 中的辯論使用連結而不是論點。
本指南涵蓋如何使用它,以及更有用的是,對您默默地撒謊的數學約會的五種方式,以便您在自己的程式碼中識別它們。
TL;DR: 選擇兩個日期 toolz。dev 日期差分計算器 並獲得以天、週、月和年為單位的確切間隙 - 即時、免費、客戶端。每次檢查的三個陷阱:包容性與排他性計數(結束日期是否計算在內?)、月份算術(月份有28 個cod31 天,所以"1 個月後"是不明確的)和時區(沒有時區的日期是每個區域中不同的時刻 - 首先使用 轉換時間戳記 時間戳轉換器).對於重複的間隔而不是一次性的間隙,that'是一份工作 克朗解析器.
主要特點
確切的天數(無夏令時地雷)
基本輸出:兩個日曆日期之間的精確天數。天真的 (b - a) / 86400000 你'每當當地時間的日期之間出現夏令時過渡時,就會在一千個 JavaScript 中發現程式碼庫中斷,產生像 89.958333 天這樣的結果,然後向錯誤方向四捨五入。此計算器透過在進行任何算術之前將兩個日期解析為 UTC 來避開整個錯誤類別 - UTC 從不向前或向後跳動,因此一天總是恰好是 86,400,000 毫秒,計數結果乾淨。同時,年/月/天的細分是用真實的日曆數學計算的(提前整個月份,然後計算剩餘的天數),而不是除以平均月份。當您的程式碼顯示 90 且計算器顯示 89 時,請相信計算器並前往在本地時間資料中尋找 DST 邊界。
一次多個單位
相同的差距同時表示為天、週、月和年。這比聽起來更有用,因為不同的領域講不同的單位:法律合約以月為單位,衝刺計劃以週為單位,計費以天為單位,人力資源以服務年數為單位。 3 月 15 日至 9 月 15 日之間的差距為 184 天、26 週和 2 天,或恰好是 6 個月,您需要哪個數字完全取決於 who's 詢問。將它們全部放在一個視圖中意味著您停止執行 "184 除以 7 等於... 26 和 change"你腦中的算術,這正是人們錯的算術。
獨家總計加上獨家營業日
柵欄柱問題,可見。這裡的總天數是 獨家- 日期之間的間隙 - 所以週一到週五讀作 4。就在它的下面,計算器開始計算 工作日 (週一至週五,週末除外)使用 Excel' 的包容性約定; s NETWORKDAYS 使用,它還告訴您它減少了多少週末天,因此相同的週一至週五跨度讀作 5 個工作日。在同一視圖中看到獨家總計和包容性工作日計數是一個每日小提醒: "多少天&報價;根據您是否計算兩個端點,有兩個正確答案。我的 9 美元退款是因為我的程式碼回答了獨家問題,而我的定價頁面詢問了包容性問題 - 同時顯示兩種約定的工具是阻止您意外選擇一個約定的工具。
作品跨越數月、閏年和世紀
二月有 28 天,除了有 29 天; 2024 年是閏年,2100 獲勝,#39;儘管可以被 4 整除(捕捉所有人的公曆世紀規則)。計算器之所以能做到這一切,是因為它使用真實的日曆規則而不是 "一年是 365.25 天&引用;近似值。如果你'曾經需要閏年 2 月日期範圍的天數 - 應計利息、SLA 視窗、2 月 29 日生日附近的年齡計算 - 你知道這些邊緣情況正是手捲數學失敗的地方。
即時、無註冊、無上傳
日期進入,答案出來,完全是客戶端。沒有任何內容被傳輸或儲存。對於大多數日期數學來說,這是便利而不是安全 - 但並非總是如此。就業日期、醫療時間表、訴訟截止日期:日期對可以安靜地敏感,並且#39;計算器沒有理由在伺服器端看到它們。該工具加載速度很快,加載後離線工作,這也使得當有人詢問 " 時,您會到達會議中期;等等,該票已打開多久?&報價;
如何使用日期差分計算器
第 1 步:輸入開始日期
打開 日期差計算器 並設定第一個日期。使用選擇器,直接鍵入它,或點擊"今天"按鈕將其按扣到當前日期。那裡'如果您需要總計低至小時或分鐘而不是午夜至午夜,則有一個可選的時間欄位 (HH:mm)。如果您的來源資料是 Unix 時間戳或帶有時間組件的 ISO 8601 字串,請先將其解析為日曆日期 - 並仔細考慮時區,因為 1751846400 東京是 7 月 7 日,洛杉磯仍然是 7 月 6 日。這 時間戳轉換器 處理該翻譯。
第 2 步:輸入結束日期
設定第二個日期。訂單沒有'不需要擔心 - 差異是一個幅度,那裡'如果你想翻轉開始和結束,這是一個交換按鈕。這裡值得深思熟慮:你的結束日期是最後一天 的 期間或第一天 之後 它?訂閱 " 12 月 31 日結束並引用;以及 "更新 1 月 1 日&引用;描述具有不同結束日期的同一時期,這是計算 "same"範圍的兩個人之間一日分歧的最常見來源。
步驟 3:閱讀您需要單元中的差異
結果顯示了單位之間的差距。取您的問題所命名的那個,然後拒絕在它們之間手動轉換 - "6個月&報價;和&報價;182.5天&報價;不可互換,因為月份是't固定長度。如果答案將進入合約、發票或 SLA,請說明該單位 和 計數約定("30 個日曆日,不包括開始日期")因此下一個人不會't 重新引入您剛剛解決的歧義。
第 4 步:理智-檢查您的程式碼
如果您'正在使用計算器調試應用程序,請將其答案與程式碼針對同一對日期產生的結果進行比較。恰好一天的錯配意味著柵欄柱或時區邊界問題。小數天的錯配意味著 DST 變化的毫秒除法。月底左右兩三天的不匹配意味著月算術溢出。這 尺寸 錯誤之一是診斷 - 以下對每個錯誤都有更多資訊。
技術深度潛水:為什麼約會數學出錯
日期算術看起來像減法,實際上是一堆日曆規則、時區政治和定義模糊性。幾乎每個錯誤 I' 都有五種失敗模式;已發貨或審核。
1. 柵欄柱(一對一)問題。 第 1 天到第 15 天之間有 14 個間隔,但如果你計算兩端,則為 15 天。兩個數字都不是"差異&報價;直到您指定約定。飯店住宿、貸款利息和租賃期間均採用獨家計票;處方、活動持續時間和&報價;承保天數和報價天數;通常使用包容性。錯誤模式:系統的一部分使用每個。寫下約定。
2. 月份不是一個單位。 &引用; 1 月 31 日後一個月&引用;沒有明顯的答案 - 2 月 31 日沒有'不存在。 JavaScript'的遺產 Date 透過溢出來處理此問題: new Date(2026, 0, 31) 另外,3 月 3 日(2 月 28 日 + 3 個溢出日)還有一個月。 PHP's strtotime('+1 month') 也做同樣的事情。大多數人類和大多數計費系統都想要 夾緊 相反:1 月 31 日 + 1 個月 = 2 月 28 日(或 29 日)。庫有所不同 - 預設在其新增月份幫助程式中註明日期 fns 和碳夾,原始 Date 溢出--還有新的 時間 API 使該行為成為明確的選擇,這是正確的設計。如果您的應用程式每月在 28 日之後執行任何錨定日期,這就是您遇到的錯誤,無論您是否'是否已找到它。
3. 一天並不總是24小時。 在任何遵守夏令時的時區,一年中有一天持續 23 小時,另一天持續 25 小時。計算日差的代碼為 milliseconds / 86_400_000 每當範圍跨越轉換以及後續轉換時,都會產生非整數 Math.round vs Math.floor 選擇決定是否'相差一。穩健的方法是在日曆日期(而不是即時)進行日算術,或在除法之前將所有內容標準化為沒有 DST 的 UTC。
4. 沒有時區的日期不是某個時刻。 &報價;2026-07-06&報價;是24小時通行的 範圍 它在每個時區的不同時刻開始和結束。 JavaScript 中該錯誤的最惡劣版本: new Date("2026-07-06") 解析為 世界標準時間午夜 根據 ECMAScript 規範,因此在格林威治以西的任何時區,它都會顯示為 7 月 5 日。我在 React 儀表板中為此損失了一個下午的大部分時間,該儀表板的日期來自 Postgres DATE 為美國用戶提前一天顯示的列 - 該列很好,API 很好,構造函數是錯誤。如果您從這篇文章中刪除一行:切勿餵食裸內容 YYYY-MM-DD 字串到 new Date() 當當地時間解釋很重要時。
5. ISO 8601 是另一個問題的答案。 ISO 8601 (2026-07-06,大端,零填充)求解日期 代表- it'明確在哪裡 07/06/2026 在俄亥俄州意味著 7 月 6 日,在牛津意味著 6 月 7 日,它按字典順序排序。在每個日誌、API 和檔案名稱中使用它。但它對日期沒有任何作用 算術;一對格式完美的 ISO 日期仍然存在上述所有四個問題。格式學科和數學學科是獨立的學科。
元課程:使用真實的日曆庫(當您的目標支援時,date-fns、Luxon、Carbon 或Temporal),在日曆空間而不是毫秒空間中進行算術,並驗證邊緣情況- 月末、閏日、夏令時週末 - 針對像這樣的獨立來源 計算器. 獨立驗證是工具的全部意義;更多關於這個哲學的內容 時間戳轉換器指南.
常見用例
計費週期和試用時間
訂閱系統在日期數學上生死存亡。按比例分配需要在計費週期內準確計算天數;試驗需要明確的結束日期;年度計劃需要在 2 月 29 日繼續存在。在建立付款流程時,我現在在編寫測試之前計算每個週期邊界兩次 - 一次在代碼中,一次在計算器中。它至少四次捕獲了真正的錯誤,總是在月末或夏令時邊緣,並且總是以混亂的客戶電子郵件形式出現的錯誤。如果金錢與系統中任何地方的天數相乘,請獨立驗證天數。
專案截止日期和衝刺規劃
&報價;從現在到發布日期有多少個工作週? &報價;每次計劃會議都會出現,人們頭腦中計算的答案可靠地偏離一兩個 - 人類不擅長跨月計數。以天和週為單位獲取真實的日曆間隙需要五秒鐘,並且會使對話變得合理。從那裡你可以誠實地減去假期和緩衝,而不是從已經樂觀一周的數字開始。
合約、通知和截止日期計算
法律和人力資源日期附帶無情的慣例:90 天的通知期、30 天的治癒窗口、到期申請和報價;服務 21 天內。&報價;這些正是包容性雷區與排他性雷區,延遲一天的成本絕對比提前一天的成本更差。計算跨度,然後確認文件使用的端點約定。 (對於任何真正重要的事情,律師都會擊敗計算器 - 該工具告訴您計數,而不是司法管轄區's 計數規則。)
年齡和任期計算
年齡、服務年資、帳戶壽命 - 全部&報價;年月差&報價;隱藏在內部的夾緊規則存在問題(2 月 29 日出生的人的法定生日是 2 月 28 日或 3 月 1 日,具體取決於司法管轄區,這是工程師必須編碼的真實內容)。快速回答 - 該帳戶的年齡、距離上次部署多久、距離事件發生多久 - 計算器在不加載 REPL 的情況下給出確切的數字。
數據健全性檢查
當報告顯示平均訂單到交貨的間隔為 47 天,而您的直覺顯示為兩週時,請按實際行並手動檢查兩個日期。 "bug" 的一半時間;是時區移動或向上游解析時交換的月/日。根據可信任計算器抽查三行或四行是決定是否不信任管道或直覺的最快方法。為了觀察兩個匯出的報告之間的變化, 文字差異工具 與此工作流程完美配對。
計算約定進行比較
| 公約 | 週一 → 週五等於 | 用於 | 小心 |
|---|---|---|---|
| 獨家(差距) | 4天 | 飯店住宿天數、應計利息、入住天數 | 感覺與報價;一個簡短的報價;給非技術讀者 |
| 包容性(跨度) | 5天 | 用藥日、活動持續時間和報價;承保天數和報價; | 與專有系統混合時,一次一個地 |
| 工作日 | 4 或 5 減去假期 | SLA、運費估算、法定期限 | 假期日曆因國家甚至合約而異 |
| 精確的 24 小時週期 | 取決於時間 | 出租、停車、API 費率窗口 | DST 使當地一天為 23 小時,另一天為 25 小時 |
| 日曆月/年 | &報價;1個月後&報價; | 計費週期、合約、租賃 | 月份長度各不相同;月末夾緊與溢出 |
表'真實訊息:"這些日期和報價之間有多長;不是一個問題。選擇與您的問題相符的行,在程式碼和副本中明確命名它,整個爭議類別就會消失。其餘的都是同樣的紀律 web 開發人員工具包 繼續推動 - 讓隱式顯式化,一半錯誤就會消失。
問號
什麼是日期差計算器?
日期差異計算器計算兩個日曆日期之間的確切差距,以天、週、月和年為單位表示。與心算或樸素毫秒減法不同,它應用真實的日曆規則 - 可變的月份長度、閏年、世紀規則 - 因此結果在閏年的二月或跨越夏令時過渡的範圍等邊緣情況下是正確的。
如何計算兩個日期之間的天數?
將兩個日期輸入 日期差計算器 並閱讀日期計數。手工完成,計算開始月份的剩餘天數,添加其間的完整月份,然後將天數添加到結束月份 - 並預先決定是否計算結束日期本身。最後一個決定,包括計數與排他計數,是大多數手動計算出錯的地方。
計算日期之間的天數時是否包含結束日期?
按照慣例,不 - 標準&報價;差異&報價;是排他性的,計算日期之間的間隔,所以週一到週五是 4 天。但許多現實世界的背景(用藥時間表、承保期限、活動長度)都包括在內,因此 5。兩者都不是錯的;他們回答不同的問題。始終說明您和#39;當號碼進入合約或發票時使用。
為什麼我的 JavaScript 日期數學會給出不同的答案?
三個常見嫌疑犯: new Date("YYYY-MM-DD") 將裸日期字串解析為 UTC 午夜,將西部時區的日期移動一天;將毫秒差除以 86,400,000 DST 轉換的中斷,其中一天為 't 24 小時;並在月末(1 月 31 日 + 1 個月 = 3 月 3 日)添加帶有舊日期物件溢出的月份。使用日曆感知庫(例如 date-fns、Luxon 或 Temporal API)而不是原始算術。
當月份的長度不同時,如何計算月份?
月差是在日曆上計算的,而不是用天數除以平均值:3 月 15 日至 9 月 15 日正好是 6 個月,儘管它' 184天。模糊性出現在 28 日之後 - 1 月 31 日之後的一個月通常被限制為 2 月 28 日或 29 日。表現良好的計費系統夾;簡單的程式碼溢出到三月初,這是一個值得檢查的真正錯誤。
閏年會影響日期差異嗎?
是的 - 跨越閏年 2 月 29 日(如 2024 年或 2028 年)的任何範圍都比平年的相同範圍多包含一天,正確的計算器會自動解釋它。微妙的規則:可被 100 整除的年份不是閏年,除非也可以被 400 整除,因此 2000 年是閏年,但 2100 won't be。手動滾動&引用;可被 4" 整除;檢查恰好在那些年份失敗。
時區如何影響日期之間天數的計算?
裸日期是每個時區不同的 24 小時窗口,因此不同區域的兩個系統可以合理地對 " & 今天&引用; 是 - 午夜附近的時間戳記可以落在不同的日曆日期,具體取決於用於解釋它的區域。對於純日曆日期差異,時區 don't 應用;對於時間戳派生的日期,請先使用類似工具將兩個時間戳轉換為同一區域 時間戳轉換器.
toolz。dev 日期差異計算器是免費且私有的嗎?
兩方面都是肯定的。它完全在您的瀏覽器中運行,無需註冊 - 您輸入的日期永遠不會上傳、記錄或存儲在任何地方。這比看起來更重要,因為日期對可以編碼敏感事實,例如工作期限、醫療時間表或法定截止日期,以及#39;計算器不需要在伺服器端查看它們沒有技術原因。



