年齢計算機 — 年、月、日での正確な年齢
生年月日を入力すると、年・月・日の単位での正確な年齢をすぐに計算する無料の年齢計算機。総週数、総日数、総時間数も同時に表示するほか、次の誕生日までの残り日数もわかるので、記念日の確認や年齢を証明する書類の作成準備、周囲へのお祝いの贈り物の計画づくりにも幅広く役立てられる。
年齢計算機
あなたは Monday
次の誕生日: 127日後 (37歳になります)
他の単位での年齢
人生の進捗
あなたの年齢と、説明的な80年の参照期間。
ドキュメンテーション
年齢計算機とは何ですか?
年齢計算機は、生年月日と通常は今日である基準日の2つの日付の間の正確な期間を求めます。結果は年、月、日で示されるほか、月、週、日、時間、分、秒の累計でも示されます。過去または未来の日付を基準に年齢を計算することもでき、その日に何歳だったか、または何歳になるかを確認できます。
年齢の計算方法
年齢とは、2つの暦日付の間隔です。この間隔を表す正しい方法は2つあり、目的に応じてどちらも役立ちます。
暦による年齢(年、月、日)
これは、「33歳、4か月、5日」のように、日常的に年齢を表す方法です。次の3段階で求めます。
- 生年月日から経過した満年数を数える。
- 直近の誕生日から経過した満月数を数える。
- そこから残りの日数を数える。
1か月の日数はすべて同じではないため、月末近くでは手順3が難しくなります。1月31日生まれの人を3月1日時点で計算すると、年齢は1か月と1日です。1月31日の1か月後は2月28日です(うるう年では2月29日)。2月31日は存在しないためです。その翌日は3月1日です。この方法は、普及に貢献したPythonライブラリにちなんでrelativedeltaルールと呼ばれることもあり、短い月では記念日の日付をその月の末日に合わせます。これにより、日数が負になることを防ぎます。
経過時間の合計(日、時間、秒)
経過した時間を正確に数えるには、両方の日付を1つの時点に変換し、その差を満日数で求めます。
dは経過した日数、tは基準日、bは生年月日を表し、それぞれミリ秒単位の数値として扱う。除数は1日あたりのミリ秒数である。
引き算の前に、両方の日付をUTC(協定世界時)の午前零時に設定します。これにより、夏時間の変更によって1時間が加算または減算され、日数がずれることを防ぎます。日数の合計から、週数は日数を7で割って切り捨てます。時間、分、秒は、日数にそれぞれ24、1,440、86,400を掛けて求めます。
経過日数の合計を365または365.25で割ると、年単位のおおよその年齢が得られますが、その期間に含まれる年のうち、どれがうるう年かは考慮されません。上で説明した暦による計算は正確です。「私は何歳ですか」という問いには暦による年齢を使います。服薬時刻の計測や、記念日までのカウントダウンなど、正確な経過時間が必要な処理には、合計日数または週数を使います。
計算例
2000年1月1日生まれの人を、2020年1月1日時点で計算した場合:
| 項目 | 値 |
|---|---|
| 暦による年齢 | 20年、0か月、0日 |
| 合計月数 | 240 |
| 合計週数 | 1,043 |
| 合計日数 | 7,305 |
| 合計時間 | 175,320 |
| 合計分数 | 10,519,200 |
| 合計秒数 | 631,152,000 |
| 生まれた曜日 | 土曜日 |
合計7,305日は、20年 × 365日に、うるう年である2000年、2004年、2008年、2012年、2016年の5回のうるう日を加えたものです。これらの年にはそれぞれ、20年間の期間内に二月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
111const MS_PER_DAY = 86400000;
2
3// Add n months, clamping the day to the target month's last day
4// (31 January + 1 month = 28 February). Date.UTC on its own does not
5// clamp: it would roll that date forward into March.
6function addMonthsUTC(base, n) {
7 const total = base.getUTCMonth() + n;
8 const y = base.getUTCFullYear() + Math.floor(total / 12);
9 const m = ((total % 12) + 12) % 12;
10 const lastDay = new Date(Date.UTC(y, m + 1, 0)).getUTCDate();
11 return Date.UTC(y, m, Math.min(base.getUTCDate(), lastDay));
12}
13
14function calendarAge(birth, target) {
15 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
16 + (target.getUTCMonth() - birth.getUTCMonth());
17 if (addMonthsUTC(birth, months) > target.getTime()) months -= 1;
18 const anchor = addMonthsUTC(birth, months);
19 return {
20 years: Math.floor(months / 12),
21 months: months % 12,
22 days: Math.floor((target.getTime() - anchor) / MS_PER_DAY),
23 };
24}
25
26const birth = new Date(Date.UTC(2000, 0, 1));
27const target = new Date(Date.UTC(2020, 0, 1));
28
29calendarAge(birth, target); // { years: 20, months: 0, days: 0 }
30Math.floor((target - birth) / MS_PER_DAY); // 7305
311' 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は、"md"引数について、月の境界付近では負の数や誤った
日数を返すことがあると警告しています。そのため、この式の残りの日数の部分は、上記の月末に合わせる規則と
常に一致するとは限りません。
よくある質問
自分の正確な年齢を知るにはどうすればよいですか? 生年月日を入力し、基準日は今日のままにします。結果には、年、月、日による年齢と、合計日数、週数、時間数、秒数による同じ年齢が表示されます。
2つの年齢計算機で答えが異なるのはなぜですか? 通常は、月の境界付近で残りの日数をどのように数えるかが違うためです。上で説明したように月末に、その月の短い日数に合わせて調整する計算機は、経過時間を単純に30で割る計算機と、1日または2日異なることがあります。
計算ではうるう年が考慮されますか? はい。合計日数には、2つの日付の間にあるすべての2月29日が含まれます。2月29日がない年では、うるう日に生まれた人の誕生日は、その月の末日である2月28日として数えます。1996年2月29日生まれの人は、2023年2月20日時点で26歳、11か月、22日です。次の誕生日は8日後の2023年2月28日になります。
過去または未来の日付について年齢を計算できますか? はい。基準日を未来の日付にすると、その日に何歳になるかがわかります。過去の日付にすると、その時点で何歳だったかがわかります。生年月日自体を未来の日付にすることはできず、基準日を生年月日より前にすることもできません。
タイムゾーンは結果に影響しますか? いいえ。日数を数える前に両方の日付をUTCの午前零時に変換するため、ユーザーの所在地や夏時間の変更にかかわらず合計は同じです。
日数を365.25で割った結果と日数のカウントが異なるのはなぜですか? 365.25は1年の平均的な長さにすぎず、その期間に含まれる具体的な年のうち、どれが366日間のうるう年かは追跡しません。実際の2つの暦日付の間にある満日数を数える方法は正確です。
出典
- Python
dateutil—relativedelta、上記の暦による年齢の月・日の規則。 - Javaプラットフォーム —
Period.betweenおよびChronoUnit.DAYS。 - Microsoft Excel —
DATEDIF関数。 - MDN Web Docs —
Date。 - Dershowitz, N., & Reingold, E. M. Calendrical Calculations: The Ultimate Edition. Cambridge University Press、2018年。