閏年とは?
地球が太陽を1周するのにかかる時間(1太陽年)は約365.2422日。1年を365日とすると、毎年0.2422日ずつズレが生じます。
4年間でズレが約1日になるため、4年に一度「閏年(うるう年)」として2月を29日にしてズレを補正しています。
ただし4年に一度だけでは誤差が蓄積するため、より精密なルールがあります:100年に一度は閏年にしない(1900年は閏年ではない)、400年に一度は閏年にする(2000年は閏年)。
閏年の判定ルール
プログラマーが覚えるべき閏年のロジック:
- 4で割り切れる年は閏年(候補)
- ただし100で割り切れる年は閏年でない(例外)
- ただし400で割り切れる年は閏年(例外の例外)
コードで書くと:
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
試験でよく出る問題でもあります。
2月29日生まれの誕生日はどうなる?
閏年にしか存在しない2月29日生まれの人は、非閏年の誕生日をいつとするかが問題になります。
- 日本の法律上: 2月28日の満了時点で年齢が加算される(=誕生日は2/28扱い)
- 社会慣習上: 2月28日に誕生日を祝う場合と3月1日に祝う場合がある
- システム実装: アプリによって異なる(要確認)
このツールでは、2月29日生まれの方の年齢も正確に計算します。
年齢計算の落とし穴
「誕生日から今日まで何年か」を計算するだけなら簡単そうですが、プログラムでは意外な落とし穴があります:
- 年をまたぐ計算でのオフバイワンエラー
- タイムゾーンの違い(海外サーバーと日本時間のズレ)
- 閏年をまたぐ計算(2/28→2/29の処理)
- 誕生日当日は「まだ誕生日前」か「迎えた後」か
Javaの古いDateクラスは月が0始まりで多くのバグの原因に。LocalDate(Java 8以降)を使うのが現代のベストプラクティスです。
日数計算の活用例
- 誕生日まであと何日?(カウントダウン)
- 入社/退職日からの経過日数(勤続年数計算)
- プロジェクトの締め切りまでの日数
- サービスの有効期限チェック
- 記念日(結婚記念日、子供の誕生日)から何日経過?
年齢だけでなく、「1000日記念」「100日祝い」など日数でのお祝いにも使えます。
このツールを作った理由
子供の100日祝い(お食い初め)の日程を計算しているとき、閏年をまたぐかどうかで日数が変わることに気づいて、正確に計算できるツールが欲しいと思いました。
年齢計算はよく使うのに、スマホの標準アプリにはない機能。子育てをしていると「あと何日で○歳」が意外と気になります。