フェンスポストのせいで、顧客に 9 ドルを返金したことがあります。 私が作っていた SaaS には 14 日間の試用版があり、私の比例コードは「使用日数」を計算しました。 endDate - startDate ミリ秒単位で、86,400,000 で割ると四捨五入されます。 1日の午後11時にトライアルを開始し、15日の午前1時に変換し、数学は14日間と言いました - しかし、customer'sメンタルモデルは"と言いました;私は1日にサインアップしました、that's初日、"これは15日目を15日間にしますトライアルは14日間だったのか、それとも14泊だったのか?私のコードと私の価格ページが互いに同意せず、顧客は私がそうする前に気づきました。
それが日付算術の特徴です。減算は自明であり、 定義 すべてがうまくいかないところです。 包括的または排他的なカウント。 1 月 31 日から「月」のいずれかです。2 月 28 日、3 月 2 日、または 3 月 3 日です。 夏時間の 1 日が 23 時間、別の日が 25 時間になるまで、「日」が 24 時間かどうか。 これらのすべてが少なくとも 1 回は私を苦しめ、10 年以上 Laravel と React アプリケーションを出荷しています。
あ 日付差分計算 既知の正しい結果に対して仮定 - とコード - をチェックできるように、質問に正確に答えるために存在します。 Toolz.dev 上のものは、任意の 2 つの日付間のギャップを日、週、月、年で計算し、完全にブラウザで使用します。請求期間の検証、契約期間のチェック、決済 " 発売までの日数 " 引数の代わりにリンクを使用して Slack で議論します。
このガイドでは、その使用方法について説明し、より便利なことに、数学が静かに嘘をつく日付を付ける 5 つの方法について説明し、それらを独自のコードで認識できるようにします。
tl;dr: で 2 つの日付を選択してください Toolz.dev 日付差分計算機 そして、日、週、月、年の正確なギャップを取得します - インスタント、フリー、クライアント側。 毎回チェックする3 つのトラップ: 包含対排他的なカウント (終了日はカウントされますか?) 、月の算術 (月は28 ~ 31 日なので、" 1 ヶ月後" は曖昧です) 、およびタイムゾーン (タイムゾーンのない日付は、すべてのゾーンで異なるインスタントです - 最初にタイムスタンプを変換します) タイムスタンプ コンバーター. 1 回限りのギャップではなく、繰り返しの間隔の場合、それは クロンパーサー。
主な機能
正確な日数 (DST の地雷なし)
基本的な出力: 2 つのカレンダーの日付間の正確な日数。 ナイーブ (b - a) / 86400000 you' lll find in a thousand JavaScript codebases breaks whenever a daylight-saving transition sits between the dates in local time, producing results like 89.958333 days that then get rounded in which worreg is wrong.この計算機は、任意の算術を行う前に両方の日付をUTCとして解析することで、バグのクラス全体を回避します - UTCは、前進したり後退したりすることはありませんので、1 日は常に正確に86,400,000 ミリ秒があり、カウントがきれいになります. years/months/daysの内訳は、その間、実際のカレンダーの数学で計算されます (丸々月の前倒し、その後、残りの日を数えます), 平均月で割ることではなく、コードが90 と言い、計算機が89 と言うとき、計算機を信じて、ローカル時間データのDST境界を見つけに行きます。
複数のユニットを同時に
同じギャップを、日、週、月、年 - 同時に表現します。これは、異なるドメインが異なる単位を話すため、思っているよりも便利です。法的契約は月で話し、スプリント計画の話は週で、請求の話は日で、人事の話は勤続年数で話します。 3 月 15 日と 9 月 15 日の間のギャップは 184 日、26 週間と 2 日、または正確に 6 か月であり、どの数字が必要なかは完全に who's の質問に依存します。それらをすべて 1 つのビューにすると、"184 を 7 で割ると... 26 になり、change" を実行するのをやめることになります。頭の中で算数を計算すると、まさに算数の人が間違ってしまいます。
排他的な合計と包括的な営業日
フェンスポストの問題、目に見えるようになった。 ここでの総日数は 専用- 日付の間のギャップ - だから月曜日から金曜日は4 として読みます その真下、電卓はカウントされます 営業日 (月曜日から金曜日、週末は除く) Excel& #39; s NETWORKDAYSが使用する包括的なコンベンションを使用して、また、それが落ちた週末の日数も教えてくれるので、同じ月曜日から金曜日のスパンが5 営業日と同じビューで排他的な合計と包括的な労働日のカウントを見ることは、小さな毎日のリマインダーです " 何日" 両方のエンドポイントを数えるかどうかに応じて2 つの正解があります。 $9 の払い戻しは、私の価格ページが包括的なものを尋ねている間に私のコードが排他的な質問に答えたため、私のコードが排他的な質問に答えたため、そして両方の規約を一度に表示するツールは、誤って1 つを選択するのを止めるツールです。
数か月、うるう年、数世紀にわたって機能します
2 月は29 を持つときを除いて28 日です; 2024 年は閏年でした、2100 ウォン' 4 で割り切れるにもかかわらずそうではありません (全員を捕まえるグレゴリオ世紀の規則)。 " ではなく実際のカレンダー規則を使用しているため、計算機はこのすべてを取得します。年は 365.25 日です" 近似。 if you've ever needed the day count for a date range spaning February in a leap year - interest accrual, SLA windows, age calculations near a Feb 29 birthday - you know these edge cases are precisely where hand-rolled math fails.
インスタント、サインアップなし、アップロードなし
日付が入って、答えが出て、完全にクライアント側.何も送信または保存されません.ほとんどの日付の数学のためにこれはセキュリティではなく利便性です - しかし、常にではありません.雇用日, 医療タイムライン, 訴訟の締め切り: 日付のペアは静かに敏感になることができます, そして、そこ& #39; s理由がない計算機は、これまでサーバー側で見るべきです. ツールは、高速にロードされ、一度ロードされたオフラインで動作します, また、それはあなたが誰かが尋ねるときに会議の途中で到達するものになります " 待って, そのチケットは開いてどのくらいですか? "
日付差分計算機の使い方
ステップ 1: 開始日を入力してください
を開きます 日付差分計算 そして最初の日付を設定します ピッカーを使うか 直接入力するか 今日 ボタンを押して 現在の日付にスナップします There' s オプションの時刻フィールド (HH: mm) 午前0 時から深夜0 時ではなく、時間や分までの合計が必要な場合 ソースデータがUnixタイムスタンプまたは時間コンポーネントを持つISO 8601 文字列の場合は、最初にカレンダーの日付に解決します - そしてタイムゾーンについて熟慮するからです 1751846400 東京では 7 月 7 日、まだロサンゼルスでは 7 月 6 日です。 ザ・ タイムスタンプ コンバーター その翻訳を処理します。
ステップ 2: 終了日を入力してください
2 番目の日付を設定します。 order does' 心配する必要はありません - 違いは大きさです、そしてthere' とにかく開始と終了を反転させたい場合は交換ボタン ここで意図的な考えの価値があります: あなたの終了日は最終日です の 期間または最初の日 のあと それ? 「12 月 31 日に終了する」と「1 月 1 日を更新」するサブスクリプションは、同じ期間を異なる期間で表しており、これは、「同じ」範囲を計算する 2 人の 1 日の不一致の最も一般的な原因です。
ステップ 3: 必要なユニットの違いを読み取る
結果は単位間のギャップを示します。 問題が単位で示されているものを取り、後でそれらの間で手で変換することに抵抗します - "6 months" および "182.5 days" 月は aren't 固定長であるため、交換可能ではありません。答えが契約、請求書、または SLA に入る場合は、単位を記載します あんど カウント規則 (「開始日を除く 30 暦日」) であるため、次の人は、あなたが解決したあいまいさを再導入しません。
ステップ 4: コードに対する正気度チェック
計算機を使用してアプリケーションをデバッグしている場合は、その答えを、同じ日付のペアに対してコードが生成するものと比較します。 1 日の不一致は、フェンスポストまたはタイムゾーン境界の問題を意味します。 1 日数の不一致は、DST の変化を超えてミリ秒の除算を意味します。 月末の 2 ~ 3 日の不一致は、月の演算オーバーフローを意味します。 ザ・ サイズ エラーのうち診断は、以下のそれぞれについて詳しく説明します。
テクニカル ディープ ダイブ: なぜ日付がうまくいかないのか
日付算術は減算のように見え、実際にはカレンダー ルール、タイムゾーンの政治、定義上のあいまいさの山です。 出荷またはレビューしたほぼすべてのバグは、5 つの障害モードで考慮されています。
1. フェンスポスト (1 対 1 ) の問題。 1 日目から 15 日目までの間に 14 の間隔がありますが、両端を数えれば 15 日です。 規則を指定するまで、どちらの番号も「違い」ではありません。 ホテルの夜、貸出金利、レンタル期間は、排他的なカウントを使用します。処方箋、イベント期間、および「補償範囲の日数」は、通常、包括的です。 バグ パターン: システムの一部がそれぞれを使用します。 慣習を書き留めます。
2. 月は単位ではありません。 " 1月31" の1 ヶ月後明らかな答えがない - 2月31 does& #39; t exist. JavaScript& #39; s legacy Date オーバーフローによってこれを処理します。 new Date(2026, 0, 31) さらに、3 月 3 日 (2 月 28 日 + 3 日のオーバーフロー日) に 1 か月間着陸します。 strtotime('+1 month') 同じことをします。 ほとんどの人間、およびほとんどの課金システムは、 クランプ 代わりに: 1 月 31 + 1 か月 = 2 月 28 日 (または 29 日)。ライブラリは異なります - date-fns と Carbon clamp は、デフォルトで月追加ヘルパー (raw) にあります Date オーバーフロー - そして新しいもの 一時的な API 動作を明示的なオプションにします。これは正しい設計です。 アプリが 28 日以降にアンカー デートを行うと、月例で何かを行う場合、まだ見つけたかどうかにかかわらず、これがバグです。
3. 1 日が 24 時間とは限りません。 夏時間を観察するタイムゾーンでは、1 日 23 時間、別の 1 日は 25 時間持続します。 日差を計算するコード milliseconds / 86_400_000 範囲が遷移を超えたときと、次の値を超えた場合はいつでも、整数以外を生成します。 Math.round vs Math.floor 選択は、あなたと #39; が 1 つずつずれているかどうかを決定します。堅牢なアプローチは、分割する前に、瞬間ではなくカレンダーの日付に日演算を実行するか、DST のない UTC にすべてを正規化することです。
4. タイムゾーンのない日付は、時間の中にありません。 「2026-07-06」は 24 時間幅です。 範囲 これは、すべてのタイムゾーンで異なるインスタントで開始および終了します。 JavaScript でこのバグの最も厄介なバージョン: new Date("2026-07-06") として解析します UTC 深夜 ECMAScript の仕様によると、グリニッジの西にあるどのタイムゾーンでも、7 月 5 日と表示されます。 Postgres からの日付の React ダッシュボードで、午後のほとんどをこれに負けました DATE 米国のユーザーのために1 日早く表示された列 - 列は大丈夫でした、APIは大丈夫でした、コンストラクタはバグでした この記事から1 行離れた場合: 裸をフィードしないでください YYYY-MM-DD ストリングに new Date() 現地時間の解釈が重要な場合。
5. ISO 8601 は、別の質問に対する答えです。 ISO 8601 (2026-07-06、ビッグエンディアン、ゼロパッド付き) 日付を解決します 表現- it'どこにあるのかは明確です 07/06/2026 オハイオ州では 7 月 6 日、オックスフォードでは 6 月 7 日を意味し、辞書式で並べ替えます。 すべてのログ、API、およびファイル名で使用します。 でも、それは日付には何もしません 算数; 完全にフォーマットされた ISO 日付のペアには、上記の 4 つの問題がすべて残っています。 フォーマットの規律と数学の規律は別の分野です。
メタ レッスン: 実際のカレンダー ライブラリ (ターゲットがサポートしている場合は、date-fns、Luxon、Carbon、または Temporal) を使用し、ミリ秒空間ではなくカレンダー空間で算術演算を実行し、エッジ ケース (月末、閏日、DST) を検証します。週末 - などの独立したソースと比較します 電卓。 独立検証は、ツールの要点です。その哲学については、 タイムスタンプ コンバーター ガイド。
よくある使用例
請求期間と試用期間
サブスクリプションシステムは、日付の数学でライブとダイ Prorationは、請求期間内に正確な日数を必要; トライアルは、明確な終了日を必要; 年間計画は、2月29 日を生き残る必要があります 支払いフローを構築するとき私は今、すべての期間の境界を2 回計算する - コードで1 回、電卓で1 回 - テストを書く前に、少なくとも4 回、実際のバグをキャッチしています、常に月末またはDSTエッジで、そして常に混乱した顧客メールとして表面化していたであろう種類 お金がシステム内の任意の場所で日数に対して乗算する場合は、独立して日数を確認します。
プロジェクトの締め切りとスプリント計画
" 今から発売日までの労働週数は?" すべての計画会議で出てきて、人々が頭の中で計算する答えは確実に1 つまたは2 つオフです - 人間は月の境界を越えて数えるのが苦手です 1 日と週で本当のカレンダーのギャップを得るには5 秒かかり、会話を根拠づけます そこから、すでに楽観的だった数から始めるのではなく、正直に休日やバッファを差し引きます。
契約、通知、および期限の計算
法的および人事日付は容赦のない慣習が付属しています: 90 日の通知期間、30 日の治癒期間、提出期限 " サービスの21 日以内に. " これらはまさに包括的vs排他的地雷原であり、1 日遅れるコストは1 日早まるコストよりも断定的に悪いスパンを計算し、次に文書が使用するエンドポイント規則を確認します。 (そして、真に重要なことについては、弁護士が計算機を殴打します - ツールは管轄ではなくカウントを伝えます& #39; sカウントルール。)
年齢と在職期間の計算
年齢、勤続年数、アカウントの有効期間 - すべて " 年月差" 内部に隠れているクランプ ルールの問題 (2 月 29 日生まれの人は、管轄区域に応じて法的な誕生日が 2 月 28 日または 3 月 1 日ですが、これはエンジニアがエンコードする必要があったものです)。簡単な答えとして、このアカウントの年齢、最後の展開からどれくらい、インシデントから何日か - 計算ツールは、REPL をロードせずに正確な数値を示します。
データの正気度チェック
レポートに、注文と配達の平均ギャップが 47 日で、直感が 2 週間と書かれている場合は、実際に 1 行を取り、2 つの日付を手で確認してください。 「バグ」は、時間帯のシフトまたはアップストリームでの 1 日のスワップによる時間の半分です。 信頼できる計算機に対して 3 行または 4 行をスポット チェックすることが、パイプラインまたは自分の根性を信頼できないかどうかを判断する最も簡単な方法です。 エクスポートされた 2 つのレポートの間で何が変わったかを確認するために、 テキスト差分ツール このワークフローとよく合います。
比較の計算方法
| 慣習 | 月 → 金は等しい | に使用 | 注意してください |
|---|---|---|---|
| 排他的 (ギャップ) | 4日 | ホテルの夜、利息発生、年齢の日数 | 技術に詳しくない読者には「1 つ短い」と感じます |
| 包括的 (スパン) | 5日 | 投薬日、イベント期間、「補償範囲の日数」 | 排他的なシステムと組み合わせると、1 つずれている |
| 営業日 | 4、5 マイナスの休日 | SLA、配送見積もり、法的期限 | 休日のカレンダーは国によって異なり、契約によっても異なります |
| 正確な 24 時間 | 時間による | レンタル、駐車場、API レート ウィンドウ | DST は 1 日 23 時間、別の 25 時間にします |
| 暦月/年 | 「1か月後」 | 請求サイクル、契約、テナント | 月の長さはさまざまです。月末でクランプする場合とオーバーフローする場合とはオーバーフロー |
表の本当のメッセージ: 「これらの日付の間の期間」は、1 つの問題ではありません。 問題に一致する行を選択し、コードとコピーで明示的に名前を付けます。異論のカテゴリ全体が消えます。 これは、残りの部分と同じ規律です。 Web 開発者ツールキット 押し続けます - 暗黙的な明示的なバグを作成し、バグの半分を蒸発させます。
フェイク
日付差分計算機とは何ですか?
日付差計算ツールは、日、週、月、年で表される 2 つのカレンダー日付間の正確なギャップを計算します。暗算や単純なミリ秒減算とは異なり、実際のカレンダー ルール (変動する月の長さ、閏年、世紀のルール) が適用されるため、結果は次のようになります。閏年の 2 月や夏期移行期間にわたる範囲などのエッジ ケース全体で正しいです。
2 つの日付の間の日数を計算するにはどうすればよいですか?
両方の日付を 日付差分計算 そして日数を読みます 手作業で行うと、開始月の残りの日数を数え、その間に丸々月を追加し、その日を終了月に追加します - そして、終了日自体を数えるかどうかを事前に決定します。インクルーシブカウントとエクスクルーシブカウントという最後の決定は、ほとんどの手動計算が 1 つ間違う場所です。
日付間の日数を数える場合、終了日は含まれますか?
慣例により、いいえ - 標準 "差分 " は排他的です, 日付間の間隔をカウント, ので、月曜日から金曜日は4 日です.しかし、多くの現実世界のコンテキスト (薬のスケジュール, カバレッジ期間, イベントの長さ) 包括的にカウント, それを作る 5.どちらも間違っていません; 彼らは異なる質問に答えます. 常にどの慣習を述べます you' re 数字が契約書または請求書に入るときに使用します。
JavaScript の日付の数学で別の答えが出るのはなぜですか?
3 つの通常の容疑者: new Date("YYYY-MM-DD") 裸の日付文字列を UTC の真夜中に解析し、西側のタイムゾーンで日付を 1 日シフトします。ミリ秒の差を 86,400,000 で割ると、1 日が 24 時間ない DST トランジションで休憩が取れ、月末でレガシー日付オブジェクトがオーバーフローする (1 月 31 + 1 か月 = 3 月 3 日)、月末のトランジションで月を追加します。 生の算術ではなく、日付 FNS、ルクソン、またはテンポラル API などのカレンダー対応ライブラリを使用します。
長さが異なる場合、月はどのように数えられますか?
月差は、平均で日を除算することによってではなく、カレンダー上で計算されます: 3月15 日から9月15 日まで、ちょうど6 ヶ月であるにもかかわらずit& #39; s 184 日. 28 日以降のアンカー日付であいまいさが表示されます - 1月31 日から1 ヶ月後、通常2月28 日または29 日にクランプされています 適切に動作する請求システムクランプ; 素朴なコードは3 月上旬にオーバーフローし、これは確認する価値のある本物のバグです。
うるう年は日付の違いに影響しますか?
はい - うるう年の2月29 日にまたがる任意の範囲 (2024 年または2028 年のように) は、共通の年の同じ範囲よりも1 日多く含まれ、正しい計算機は自動的にそれを説明しています微妙な規則: 100 で割り切れる年は、400 でも割り切れない限り、うるう年ではないので、2000 年はうるう年でしたが、2100 ウォン& #39; t be.手巻き" 4"で割り切れます; チェックは正確にそれらの年に失敗します。
タイムゾーンは、日付間の日数の計算にどのように影響しますか?
ベアデートは、すべてのタイムゾーンで異なる24 時間ウィンドウであるため、異なるゾーンの2 つのシステムは、合法的に何について不一致することができます " today" は - と真夜中近くのタイムスタンプは、それを解釈するために使用されるゾーンに応じて異なるカレンダー日付に該当する可能性があります 純粋なカレンダー-日付の違いの場合、タイムゾーンはdon& #39; t apply; タイムスタンプ派生日付の場合、最初にのようなツールを使用して両方のタイムスタンプを同じゾーンに変換します タイムスタンプ コンバーター。
Toolz.dev の日付差分計算機は無料でプライベートですか?
どちらの点でもはい。これは、サインアップなしで完全にブラウザーで実行されます。入力した日付は、アップロード、ログ記録、またはどこにでも保存されることはありません。日付ペアは、雇用期間、医療スケジュール、法的期限などの機密性の高い事実をエンコードできるため、これは思っている以上に重要です。there's 電卓がサーバー側でそれらを確認する必要がある技術的な理由はありません。



