나이 계산기 — 정확한 연령을 연, 월, 일 단위로
나이 계산기는 생년월일을 입력하면 오늘 날짜를 기준으로 정확한 나이를 연, 월, 일 단위로 계산한다. 총 주수, 총 일수, 총 시간수, 다음 생일까지 남은 일수도 함께 보여주어 생일이나 기념일, 법적 나이 확인 등 여러 상황에서 활용할 수 있다.
나이 계산기
당신은 다음 요일에 태어났습니다: Monday
다음 생일: 127일 후 (37살이 됩니다)
당신의 나이(다른 단위)
인생 진행 상황
당신의 나이를 예시적인 80년의 기준 범위에 대해 비교한 것입니다.
문서화
나이 계산기란?
나이 계산기는 생년월일과 목표 날짜(보통 오늘)라는 두 날짜 사이의 정확한 시간을 계산합니다. 결과는 년, 월, 일로 표시되며, 월, 주, 일, 시간, 분, 초의 누적 합계로도 표시됩니다. 과거나 미래의 날짜를 기준으로 나이를 계산할 수도 있으므로, 해당 날짜에 그 사람이 몇 살이었는지 또는 몇 살이 될지를 알 수 있습니다.
나이 계산 방법
나이는 두 달력 날짜 사이의 차이입니다. 이 차이를 올바르게 나타내는 방법은 두 가지이며, 각각 서로 다른 용도에 유용합니다.
달력 기준 나이(년, 월, 일)
사람들이 일상적으로 나이를 말하는 방식으로, 예를 들면 “33년, 4개월, 5일”입니다. 다음 세 단계로 계산합니다.
- 생년월일 이후 경과한 만 나이를 셉니다.
- 가장 최근 생일을 기준으로 경과한 만 개월 수를 셉니다.
- 그 시점부터 남은 일수를 셉니다.
3단계는 월말에 가까워지면 까다로워집니다. 달마다 일수가 같지 않기 때문입니다. 1월 31일에 태어난 사람의 나이를 3월 1일에 계산하면 1개월 1일입니다. 1월 31일에서 한 달 뒤는 2월 28일이며, 윤년에는 2월 29일입니다. 2월 31일은 없기 때문입니다. 3월 1일은 그다음 날입니다. Python 라이브러리에서 널리 사용되면서 붙은 이름을 따라 때로 relativedelta 규칙이라고도 하는 이 방법은, 짧은 달의 마지막 날에 기념일 날짜를 맞춰 일수가 음수가 되지 않도록 합니다.
총 경과 시간(일, 시간, 초)
실제로 살아온 시간을 정확히 계산하려면 두 날짜를 하나의 시점으로 변환한 뒤, 그 차이를 만 일수로 계산합니다.
여기서 d는 만 일수이고, t는 목표 날짜, b는 생년월일이며, 각각 밀리초 단위의 수로 나타냅니다. 제수는 하루에 해당하는 밀리초 수입니다.
뺄셈을 하기 전에 두 날짜를 모두 UTC(협정 세계시) 자정으로 설정합니다. 이렇게 하면 일광 절약 시간제 변경으로 한 시간이 더해지거나 빠져 일수 계산이 어긋나는 것을 막을 수 있습니다. 총 일수에서 주 수는 일수를 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에 윤년의 추가 일수 5일을 더한 값입니다. 해당 윤년은 2000년, 2004년, 2008년, 2012년, 2016년입니다. 각 연도에는 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
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" 인수가 월 경계 부근에서 음수나 잘못된
일수 결과를 반환할 수 있으므로, 해당 수식의 남은 일수 부분이 위의 날짜 조정 규칙과
항상 일치하지는 않는다고 경고합니다.
자주 묻는 질문
정확한 나이는 어떻게 계산하나요? 생년월일을 입력하고 목표 날짜는 오늘로 둡니다. 결과에는 년, 월, 일 단위의 나이와 함께 총 일수, 주 수, 시간, 초로 환산한 나이가 표시됩니다.
나이 계산기마다 결과가 다른 이유는 무엇인가요? 대개 월 경계 부근의 남은 일수를 세는 방식이 다르기 때문입니다. 위에서 설명한 것처럼 월말에 짧은 달의 마지막 날로 맞추는 계산기는 경과 시간을 단순히 30으로 나누는 계산기와 하루나 이틀 정도 차이가 날 수 있습니다.
계산에 윤년이 반영되나요? 그렇습니다. 총 일수에는 두 날짜 사이에 포함되는 모든 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일 윤년인지 반영하지 않습니다. 실제 달력 날짜 두 개 사이의 만 일수를 세는 방식이 정확합니다.
출처
- 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.