日付計算機の仕組み
日付計算機は二つの基本的な問いに答えるものです。すなわち、ある瞬間と別の瞬間はどれだけ離れているか、そして、既知の日付を一定の間隔でずらすとどの瞬間になるか、という問いです。内部では、この二つの操作は一つの統制のとれた手法を共有しています。ISO 8601 規格を用いて日付を曖昧さのない瞬間に解析し、協定世界時 (UTC) で演算を行い、ユーザーが指定した粒度に丸めた結果を提示する、という手法です。
このツールは開始日と終了日を受け取り、その間の経過期間を算出し、全日数と残りの時・分・秒として表現します。また、単一の日付と正または負の整数オフセットを受け取り、指定された年数・月数・日数を加算または減算した結果の日付を返すこともできます。いずれのモードも同じ厳密な基盤の上で動作するため、出力は決定的で再現可能です。
ISO 8601 入力解析の理解
計算機に入力されるすべての日付は、ISO 8601 の日時結合形式 YYYY-MM-DDTHH:MM:SS に準拠していなければなりません。区切り文字 T はカレンダー日付と時刻部分を分離し、すべての時刻は解析と同時に UTC として解釈されます。暗黙のローカルタイムゾーンは存在せず、サマータイム調整も、曖昧な時刻もありません。不完全なタイムスタンプ(たとえば時刻のない日付)が与えられた場合、ツールはその日の UTC 午前0時 (T00:00:00) として扱います。
ISO 8601 パターンに一致しない入力は、そのまま拒否されます。同様の厳密さは日付の順序にも適用されます。終了日が開始日より前の場合、計算は負の期間を生成しません。代わりに、ツールは入力を無効とみなして停止し、解釈の難しい結果にユーザーが依存するのを防ぎます。この「逆順拒否」ポリシーにより、出力空間は常にクリーンに保たれ、返される期間はすべて正の時間幅となります。
期間計算:日・時・分・秒
二つのタイムスタンプ間の経過時間を計算する際、ツールはまず終了時点の Unix エポック秒から開始時点のそれを差し引きます。得られた整数は経過秒数の総和を表します。この単一の値から、計算機はユーザーに表示されるすべての要素を導出します。
- 全日数は、総秒数を 86,400(標準 UTC の1日あたりの秒数)で割った整数商です。剰余が時・分・秒の各要素を埋めます。
- 総時間数は、総秒数を 3,600 で割り、整数に切り捨てた値です。これは「日数を除いた残り時間」ではなく、全期間を時間単位で表したものです。
- 総分数および総秒数も同様のパターンに従い、生の秒数をそれぞれ 60 および 1 で除して切り捨てます。
この切り捨て除算の設計により、たとえば 90,123 秒の期間は、総量表示において「1日と1時間2分3秒」とは表現されません。代わりに、総時間数は 25 時間、総分数は 1,502 分、総秒数は 90,123 秒と表示されます。これらの累計値と並んで、ツールは全日数と残りの時・分・秒に分解した対応値も表示するため、両方の視点から結果を確認できます。
月・年オフセットを用いた日付演算
日数の加減算は単純明快です。計算機は基になる UTC タイムスタンプを正確な秒数だけずらします。しかし、月と年は長さが一定でないため、ツールはカレンダーを考慮したアプローチを採用します。
ユーザーがある日付に1か月を加算する場合、ツールは月フィールドをインクリメントしつつ日付の値を保持します。ただし、一つ重要な例外があります。対象月の日数が元の日付より少ない場合、計算機は結果をその月の最終有効日にクランプ(固定)します。これが月末クランプです。たとえば、1月31日に1か月を加算すると、閏年なら2月29日、平年なら2月28日になります。この操作の間、時刻部分は一切変更されないため、2024-01-31T12:00:00 に1か月を加算すると 2024-02-29T12:00:00 となります。
年オフセットも同様に動作します。年フィールドをインクリメントし、月を保持し、結果の日付が無効な場合(最も一般的なのは、閏年の2月29日に1年を加算して平年に着地する場合)に日付をクランプします。サポートされるのは整数オフセットのみです。小数の月や年はサポートされません。なぜなら、半月が何を意味するかについて普遍的に受け入れられた定義が存在しないからです。
計算例
開始日として 2026-01-01T00:00:00、終了日として 2026-01-02T01:02:03 を指定した場合を考える。この電卓は秒単位で差分を計算する:
期間は正確に 1日、1時間、2分、3秒である。累積で表すと、25時間、1,502分、90,123秒となる。このツールは4つの粒度すべてを並べて表示するため、ユーザーは内訳表示(1全日とその余り)と各合計値の両方を確認できる。
カレンダー演算の例として、2024-01-31T12:00:00 に1ヶ月を加算するケースを考える。1月は31日あるため、単純計算では2月31日が目標日となる。しかし、2024年は閏年で2月は29日しかないため、このツールは日付を29日にクランプする。時刻部分は正午のまま固定され、結果は 2024-02-29T12:00:00 となる。このクランプ処理は決定論的であり、月末の境界ケースすべてにおいて一貫した動作をする。
精度と制限事項
この電卓は完全にUTCで動作し、タイムゾーンオフセットやサマータイムの切り替えを考慮しない。解析されたUTCタイムスタンプから直接期間を導出し、整数秒で報告するが、その結果はサマータイムのずれを経験するユーザーの「実時間」の感覚を反映しない。ロンドンのユーザーが、DSTの切り替えを挟む2つの時点の間に何時間のローカル時計時間があるかを知りたい場合、その調整を手動で適用する必要がある。
閏秒はモデル化されていない。このツールはすべてのUTC日を正確に86,400秒として扱う。数十年にわたる期間の場合、無視された閏秒による累積誤差は数十秒に達する可能性がある。これはカレンダー日付の計算では無視できるが、高精度な科学用途では注意が必要である。
このツールはまた、Unixエポック(1970年1月1日)より前の日付や9999年を超える日付を処理しない。その範囲外の入力は拒否される。月末のクランプルールは文書化され一貫して適用されているが、ビジネスルールが異なる場合があることにユーザーは注意すべきである。例えば、金融契約によっては「1月31日の1ヶ月後」を閏年か否かに関わらず毎年2月28日と定義するものもある。このツールの動作は、特定の業界標準ではなく、一般的な月末規則に従っている。
参考資料
ISO 8601 規格は日付と時刻の表現を規定しており、このツールが行うすべての解析判断の基盤となっている。完全な仕様は国際標準化機構(ISO)によって管理されている。
編集記録
本記事は日付計算モジュールのリリースに伴い作成された。2026年8月時点の実装を反映している。計算例は、数値が実際の計算結果と一致することを確認するため、同日にツールの出力と照合された。
今後の改訂では、解析ルール、サポートされる日付範囲、またはクランプ動作の変更を文書化する予定である。タイムゾーン対応の入力や閏秒のモデル化に対応するよう電卓が更新された場合、本記事もそれに応じて修正される。 著者:SoupCalc 編集チーム 最終レビュー: 2026年8月11日