Калькулятор возраста — точный возраст в годах, месяцах и днях
Бесплатный калькулятор возраста: введите дату рождения, чтобы получить точный возраст в годах, месяцах и днях, а также общее количество недель, дней, часов и дату следующего дня рождения.
Калькулятор возраста
Вы родились в Monday
Следующий день рождения: 127 дней (исполняется 37)
Ваш возраст в других единицах
Прогресс жизни
Ваш возраст по отношению к условному 80-летнему периоду.
Документация
Что такое калькулятор возраста?
Калькулятор возраста определяет точный промежуток времени между двумя датами: датой рождения и целевой датой, обычно сегодняшним днём. Результат отображается в годах, месяцах и днях, а также суммарно в месяцах, неделях, днях, часах, минутах и секундах. Возраст можно рассчитать и для даты в прошлом или будущем, чтобы узнать, сколько человеку было или будет лет в этот день.
Как рассчитать возраст
Возраст — это промежуток между двумя календарными датами. Этот промежуток можно корректно описать двумя способами, и каждый из них подходит для разных целей.
Календарный возраст (годы, месяцы, дни)
Так обычно указывают возраст в повседневной жизни: «33 года, 4 месяца и 5 дней». Он определяется в три этапа:
- Посчитать полные годы, прошедшие с даты рождения.
- От последнего дня рождения отсчитать полные прошедшие месяцы.
- Затем отсчитать оставшиеся дни.
Шаг 3 становится сложным в конце месяца, поскольку в месяцах разное количество дней. Человеку, родившемуся 31 января, при расчёте возраста на 1 марта исполнился 1 месяц и 1 день. Через месяц после 31 января наступает 28 февраля (или 29 февраля в високосном году), поскольку 31 февраля не бывает. 1 марта наступает на следующий день. Этот метод, иногда называемый правилом relativedelta по названию библиотеки Python, которая сделала его популярным, переносит дату годовщины на последний день более короткого месяца, чтобы число дней не становилось отрицательным.
Полное истёкшее время (дни, часы, секунды)
Для точного подсчёта прожитого времени обе даты преобразуют в единую временную шкалу и вычисляют разницу в полных днях:
где d — количество полных дней, t — целевая дата, а b — дата рождения, причём каждая из них представлена числом миллисекунд, а делитель — это количество миллисекунд в одних сутках.
Перед вычитанием обе даты устанавливаются на полночь по UTC (всемирному координированному времени). Это не позволяет переходам на летнее время добавлять или убирать час и искажать подсчёт дней. Из общего числа дней получают недели, разделив его на 7 и округлив вниз. Число часов, минут и секунд получают, умножив количество дней соответственно на 24, 1 440 и 86 400.
Деление общего числа дней на 365 или 365,25 даёт приблизительный возраст в годах, но не учитывает, какие годы в этом промежутке были високосными. Календарный подсчёт, описанный выше, точен. Календарный возраст используют, чтобы ответить на вопрос «сколько мне лет». Общее число дней или недель подходит для задач, требующих точного измерения прошедшего времени, например для расчёта времени приёма лекарств или отсчёта до важного события.
Разобранный пример
Человек, родившийся 1 января 2000 г., при расчёте возраста на 1 января 2020 г.:
| Показатель | Значение |
|---|---|
| Календарный возраст | 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. В каждом из этих лет было по 29 февраля, пришедшемуся на 20-летний промежуток. Поэтому число дней больше простого результата 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.
Учитывает ли расчёт високосные годы? Да. Общее число дней включает каждый 29 февраля, приходящийся на промежуток между двумя датами. В году, в котором нет 29 февраля, годовщина рождения в високосный день приходится на 28 февраля, последний день этого месяца. Человеку, родившемуся 29 февраля 1996 г., на 20 февраля 2023 г. было 26 лет, 11 месяцев и 22 дня, а его следующий день рождения наступит через 8 дней, 28 февраля 2023 г..
Можно ли рассчитать возраст для даты в прошлом или будущем? Да. Если указать будущую дату, можно узнать, сколько человеку будет лет в этот день. Если указать дату в прошлом, можно узнать, сколько ему тогда было лет. Дата рождения не может быть будущей, а целевая дата не может предшествовать дате рождения.
Влияют ли часовые пояса на результат? Нет. Перед подсчётом дней обе даты преобразуются в полночь по UTC, поэтому итог не зависит от местоположения пользователя или переходов на летнее время.
Почему число дней отличается от результата деления дней на 365,25? 365,25 — это лишь средняя продолжительность года; такое значение не учитывает, какие именно годы в промежутке были високосными годами продолжительностью 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.