日付の計算は、日常生活やビジネスで頻繁に発生します。「試験まで残り何日?」「入社してから何年経つ?」「締め切りの2週間前はいつ?」——単純に見えて、月の日数やうるう年のせいで意外と間違えやすいのが日付計算です。
しかも厄介なことに、日付計算のミスは1日だけずれることが多く、パッと見では気づきにくいという特徴があります。この記事では、よく使う計算パターンと、陥りやすい落とし穴を整理します。
日数計算の基本 — 両端を含めるかどうか
2つの日付の間の日数を求めるとき、「当日を含めるか含めないか」で結果が1日ずれます。たとえば6月1日から6月5日までは何日間でしょうか。
| 数え方 | 結果 |
|---|---|
| 差を取る(片端を含めない) | 4日間 |
| 両端を含める | 5日間 |
どちらが正しいかは目的によります。「あと何日」というカウントダウンなら前者、「何日間の滞在」なら後者です。契約や申請の期限では、この1日が意味を持ちます。
法律上は「起算日」の扱いが決まっています。民法では原則として初日不算入——つまり期間の初日は数えません。「契約から10日以内」であれば、契約日の翌日が1日目になります。
一方、年齢の計算は初日を算入します(年齢計算ニ関スル法律)。出生した日を1日目として数えるため、法律上は誕生日の前日に1歳年を取る扱いになります。学年の区切りで4月1日生まれが1つ上の学年になるのは、このルールによるものです。
「3ヶ月後」を90日で計算してはいけない
月単位の計算を日数に置き換えると、起点によって結果が変わります。
2026-01-01 + 90日 = 2026-04-01 (3ヶ月後の応当日と一致)
2026-03-01 + 90日 = 2026-05-30 (3ヶ月後は 06-01 → 2日ずれる)
2026-06-01 + 90日 = 2026-08-30 (3ヶ月後は 09-01 → 2日ずれる)
同じ「90日後」でも、間に何月が挟まるかで結果が変わります。月単位の期間は、日数ではなく「応当日」で計算するのが原則です。
応当日がない場合の扱いも決まっています。1月31日の1ヶ月後は2月31日……とはならず、その月の末日になります(民法143条)。うるう年なら2月29日、平年なら2月28日です。
2026-01-31 の1ヶ月後 → 2026-02-28(平年のため月末)
2024-01-31 の1ヶ月後 → 2024-02-29(うるう年のため月末)
月末起算の計算は「月末 → 月末」になるので、1月31日 → 2月28日 → 3月28日 のように元の「31日」に戻らない実装もあります。月末締めの処理を書くときは、この挙動を確認しておく必要があります。
うるう年の例外は2つある
うるう年は「4年に1回」と覚えられていますが、正確には3段階のルールです。
- 4で割り切れる年はうるう年
- ただし100で割り切れる年は平年
- ただし400で割り切れる年はうるう年
| 年 | 判定 | 理由 |
|---|---|---|
| 2024年 | うるう年 | 4で割り切れる |
| 2025年 | 平年 | 4で割り切れない |
| 1900年 | 平年 | 100で割り切れる |
| 2000年 | うるう年 | 400で割り切れる |
| 2100年 | 平年 | 100で割り切れ、400では割り切れない |
2000年は400年ルールに該当するうるう年でした。次に例外が現れるのは2100年です。自前でうるう年判定を書くときは、ルール1だけで済ませると2100年に破綻します。
なお、表計算ソフトのExcelは1900年をうるう年として扱います。実在しない「1900年2月29日」がシリアル値として存在するため、1900年3月1日より前の日付では計算結果が1日ずれます。初期のLotus 1-2-3との互換性のために残された仕様です。古い日付を扱うときは注意が必要です。
勤続年数・年齢は「満」で数える
勤続年数や年齢の計算では「満〇年」という表現に注意が必要です。
2020年4月1日 入社
2026年3月31日 時点
→ 5年11ヶ月(6年ではない)
6年目に入るのは2026年4月1日です。年度で区切って「2020年度入社だから6年目」と数えるのと、満年数で数えるのとでは結果が変わります。退職金や勤続表彰の計算では、どちらの数え方かを必ず確認します。
営業日の計算は自動化しづらい
「5営業日以内」のような期限は、土日祝を除いて数えます。土日は機械的に判定できますが、祝日は法律の改正や振替で毎年変わるため、計算には祝日リストが必要です。
- 祝日が日曜と重なると翌日が振替休日になる
- 祝日と祝日に挟まれた平日は休日になる(国民の休日)
- オリンピックなどの事情で祝日が移動した年がある
- 企業ごとの休業日(年末年始・創立記念日など)は法定の祝日とは別
日本の祝日は内閣府が一覧を公開しているため、システムで扱う場合はそれを取り込むのが確実です。祝日をコードにハードコードすると、法改正のたびに修正が必要になります。
タイムゾーンで日付が1日ずれる
システムで日付を扱うときに起きやすいのが、タイムゾーンによるズレです。
日本時間(JST)はUTCより9時間進んでいます。そのため、日本時間の午前0時〜8時59分は、UTCではまだ前日です。
2026-08-01 07:00 JST
= 2026-07-31 22:00 UTC ← 日付が前日になる
サーバーのタイムゾーンがUTCのまま日付を切り出すと、早朝のデータが前日として集計されます。日次バッチの集計値が微妙に合わない、という不具合の定番の原因です。日付を「日」単位で扱うときは、どのタイムゾーンでの日付なのかを決めておく必要があります。
逆算による締め切り管理
締め切り日が決まっているとき、「〇日前」に何をすべきかを逆算すると計画が立てやすくなります。試験日の3週間前が申込締め切りなら、試験日から21日を引けば申込期限が出ます。
ただし「〇日前」にも両端の問題があります。「3日前まで」が締め切り当日を含むのか含まないのかは、規約の書き方次第です。申込や解約の期限では、1日の解釈違いがそのまま損失につながるため、迷ったら提供元に確認するのが確実です。
「翌月末」「月末締め翌月払い」のような表現も、月によって期日が変わります。月末基準の計算をするときは、実際のカレンダーで確認してください。
よくある質問
Q. 「10日以内」の起算日はいつですか
A. 民法の原則では初日不算入なので、翌日が1日目です。ただし契約書に「本契約締結日を含め10日以内」といった定めがあれば、そちらが優先されます。実務では、初日を含むかどうかを明記しておくとトラブルを防げます。
Q. 2月29日生まれの人の誕生日は平年どうなりますか
A. 年齢計算上は2月28日の終了時に年を取る扱いになります。法律上は「誕生日の前日に加齢する」ルールと組み合わさるため、平年でも問題なく1歳増えます。
Q. プログラムで日付を扱うときの注意点は
A. JavaScriptの Date は月が0始まり(0が1月)である点が有名な落とし穴です。また、日付だけを扱いたいのに日時型を使うとタイムゾーンの影響を受けます。日付単位の計算では、日時ではなく日付型を使うか、タイムゾーンを固定して扱います。
Q. 週の始まりは日曜と月曜のどちらですか
A. 決まっていません。日本のカレンダーは日曜始まりが一般的ですが、ISO 8601では月曜始まりと定められています。週番号を扱うシステムでは、どちらの定義かを最初に決めておかないと、集計期間が1日ずれます。
まとめ
日付計算のミスは1日単位で起きるため、気づきにくいのが厄介なところです。
- 日数は両端を含めるかどうかで1日変わる。民法は初日不算入、年齢計算は初日算入
- 月単位の期間は日数ではなく応当日で計算する。「3ヶ月=90日」は成り立たない
- うるう年の例外は100年ルールと400年ルールの2段階。2100年は平年
- 営業日計算には祝日リストが必須。ハードコードしない
- 日付単位の集計ではタイムゾーンで1日ずれる
日数計算ツールでは、2つの日付間の日数・週数・月数をまとめて確認できます。締め切りからの逆算や、在籍・在学期間の確認にお使いください。