年齢計算機 — 年、月、日での正確な年齢
生年月日を入力すると、年・月・日の単位での正確な年齢をすぐに計算する無料の年齢計算機。総週数、総日数、総時間数も同時に表示するほか、次の誕生日までの残り日数もわかるので、記念日の確認や年齢を証明する書類の作成準備、周囲へのお祝いの贈り物の計画づくりにも幅広く役立てられる。
年齢計算機
あなたは Monday
次の誕生日: 127日後 (37歳になります)
他の単位での年齢
人生の進捗
あなたの年齢と、説明的な80年の参照期間。
ドキュメンテーション
年齢計算機とは何ですか?
年齢計算機は、生年月日と基準日(通常は今日)という2つの日付の間の正確な期間を求めます。結果は年・月・日で表示されるほか、週、日、時間、分、秒の累計でも表示されます。過去や未来の日付に対する年齢も計算でき、その日にその人が何歳だったか、または何歳になるかが分かります。
年齢の計算方法
年齢とは、2つの暦日付の間隔です。この間隔を表す正しい方法は2つあり、目的に応じてどちらも役立ちます。
暦による年齢(年、月、日)
これは、「33歳、4か月、5日」のように、日常的に年齢を表す方法です。次の3段階で求めます。
- 生年月日から経過した満年数を数える。
- 直近の誕生日から経過した満月数を数える。
- そこから残りの日数を数える。
ステップ3は、月末付近でややこしくなります。月によって日数が異なるためです。1月31日生まれの人の年齢を3月1日に測ると、1か月と1日です。1月31日の1か月後は2月28日(うるう年では2月29日)です。2月31日は存在しないためです。3月1日はその1日後です。この方法は、広めたPythonライブラリにちなんでrelativedelta規則と呼ばれることもあり、応当日を短いほうの月の最終日に丸めることで、日数が負にならないようにします。
経過時間の合計(日、時間、秒)
経過した時間を正確に数えるには、両方の日付を1つの時点に変換し、その差を満日数で求めます。
日数 = floor((基準日 − 生年月日) ÷ 86,400,000ミリ秒)
引き算の前に、両方の日付をUTC(協定世界時)の午前零時に設定します。これにより、夏時間の変更によって1時間が加算または減算され、日数がずれることを防ぎます。日数の合計から、週数は日数を7で割って切り捨てます。時間、分、秒は、日数にそれぞれ24、1,440、86,400を掛けて求めます。
経過日数の合計を365または365.25で割ると、年単位のおおよその年齢が得られますが、その期間に含まれる年のうち、どれがうるう年かは考慮されません。上で説明した暦による計算は正確です。「私は何歳ですか」という問いには暦による年齢を使います。服薬時刻の計測や、記念日までのカウントダウンなど、正確な経過時間が必要な処理には、合計日数または週数を使います。
計算例
2000年1月1日生まれの人を、2020年1月1日時点で計算した場合:
| 項目 | 値 |
|---|---|
| 暦による年齢 | 20年0か月0日 |
| 合計日数 | 7,305 |
| 合計週数 | 1,043 |
| 生まれた曜日 | 土曜日 |
合計7,305日は、20×365に、うるう年2000、2004、2008、2012、2016の分として5日のうるう日を加えた値に等しくなります。これらの年にはそれぞれ、20年の期間内に収まる2月29日が加わりました。そのため、日数は単純な20×365より多くなり、手計算では数日ずれやすいのです。
コードによる年齢計算式
上記の暦による年齢計算法は、ほとんどのプログラミング言語で実装できます。うるう年や月の日数の規則を手作業で記述するより、組み込みの日付ライブラリを使うほうが安全です。
1from dateutil.relativedelta import relativedelta
2from datetime import date
3
4birth, target = date(2000, 1, 1), date(2020, 1, 1)
5
6age = relativedelta(target, birth) # calendar age
7print(f"{age.years}y {age.months}m {age.days}d")
8
9total_days = (target - birth).days # total elapsed days
10print(total_days) # 7305
111function addMonthsUTC(d, n) {
2 const total = d.getUTCMonth() + n;
3 const y = d.getUTCFullYear() + Math.floor(total / 12);
4 const m = ((total % 12) + 12) % 12;
5 const lastDay = new Date(Date.UTC(y, m + 1, 0)).getUTCDate();
6 return new Date(Date.UTC(y, m, Math.min(d.getUTCDate(), lastDay))); // clamp to month end
7}
8
9function calendarAge(birth, target) {
10 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
11 + (target.getUTCMonth() - birth.getUTCMonth());
12 if (addMonthsUTC(birth, months) > target) months--;
13 const days = Math.floor((target - addMonthsUTC(birth, months)) / 86400000);
14 return { years: Math.floor(months / 12), months: months % 12, days };
15}
16
17const totalDays = Math.floor((target - birth) / 86400000); // 7305
181' Whole days between two dates (A1 = birth, B1 = target):
2=B1-A1
3
4' Calendar age in complete years / months / leftover days:
5=DATEDIF(A1, B1, "y") & " years, " & DATEDIF(A1, B1, "ym") & " months, " & DATEDIF(A1, B1, "md") & " days"
6MicrosoftはDATEDIFの「MD」単位を推奨していません。負の数、ゼロ、または不正確な結果が返されることがあります。
よくある質問
自分の正確な年齢を知るにはどうすればよいですか? 生年月日を入力し、基準日は今日のままにします。結果には、年、月、日による年齢と、合計日数、週数、時間数、秒数による同じ年齢が表示されます。
2つの年齢計算機で答えが異なるのはなぜですか? 通常は、月の境界付近で残りの日数をどのように数えるかが違うためです。上で説明したように月末に、その月の短い日数に合わせて調整する計算機は、経過時間を単純に30で割る計算機と、1日または2日異なることがあります。
計算にうるう年は考慮されていますか。 はい。合計日数には2つの日付の間にあるすべての2月29日が含まれ、2月29日生まれの人は、うるう年でない年には2月28日を基準に年齢が測られます。
過去や未来の日付に対する年齢も計算できますか。 はい。基準日を未来の日付にすると、その日に何歳になるかが分かります。過去の日付にすると、何歳だったかが分かります。
タイムゾーンは結果に影響しますか? いいえ。日数を数える前に両方の日付をUTCの午前零時に変換するため、ユーザーの所在地や夏時間の変更にかかわらず合計は同じです。
日数を365.25で割った結果と日数のカウントが異なるのはなぜですか? 365.25は1年の平均的な長さにすぎず、その期間に含まれる具体的な年のうち、どれが366日間のうるう年かは追跡しません。実際の2つの暦日付の間にある満日数を数える方法は正確です。
参考文献
- dateutil project. relativedelta. dateutil relativedeltaドキュメント — 加算した月が短い月の末日を超える場合は、その月の最終日が使われます。
- MDN Web Docs (Mozilla). Date. MDN Dateリファレンス — JavaScriptの日付は、UTCの1970年1月1日からのミリ秒数です。±8.64 × 10¹⁵ msは±100,000,000日に等しいため、1日は86,400,000 msです。
- U.S. Naval Observatory. Leap Years. USNOうるう年FAQ — 4で割り切れる年はうるう年ですが、400で割り切れない世紀年は除きます。2000年はうるう年です。
- Microsoft. DATEDIF function. Microsoftサポート: DATEDIF — 「Y」「YM」「MD」の単位と、「MD」の既知の制限。