年龄计算器 — 精确年龄(年、月和天)
年龄计算器只需输入出生日期,即可精确算出以年、月、日表示的当前年龄,并同时给出已经历的总周数、总天数和总小时数。工具还会自动计算距离下一个生日还剩多少天,也可以指定任意目标日期计算当时的年龄。适合用于填写表格、核对法定年龄、规划生日庆祝或单纯满足好奇心,计算结果会自动考虑闰年,保证结果准确无误。
年龄计算器
你出生于 Monday
下一个生日: 还有 144 天 (即将年满 37 岁)
你的年龄(其他单位)
生命进度
你的年龄相对于80年参考跨度的进度。
文档
此计算器的功能
输入你的出生日期,它会精确告诉你你的年龄——以年、月、天表示——就像你说出来的方式一样("我33岁4个月5天")。它还以月、周、天、小时、分钟和秒来计算同样的年龄,显示你出生的日期是星期几,以及距离下一个生日还有多长时间。
将第二个字段保持在今天以获得你当前的年龄,或将其更改为任何过去或未来的日期以查找你在该日期的年龄。
**让年龄变得复杂的一条规则:**月和年不是固定的天数。2月有28或29天;其他月份有30或31天。所以"1个月"意味着"相同的日期数,一个月后"——而不是"30天"。此计算器遵循该日历规则,这就是为什么它与仅按30或365除法的工具相差一两天的原因。
如何计算你的年龄
年龄是两个日期之间的差距。测量该差距有两种诚实的方法,此工具会显示两者。
1. 日历年龄(年、月、天)。 从你的生日计算整年数,然后计算整月数,然后计算剩余天数:
- 计算出生以来完整的年数。
- 从上一个生日起,计算完整的月数。
- 从那里起,计算剩余的天数。
微妙之处在于第3步靠近月边界时。某人出生于1月31日,在3月1日测量时,是1个月零1天大——因为"1月31日后一个月"落在2月28/29(没有2月31日),3月1日是该日期之后的一天。此计算器会夹紧到较短月份的末尾,与广泛使用的dateutil.relativedelta规则相匹配,因此月末生日永远不会产生负的天数。
2. 总经过时间(天、小时、秒)。 对于"你的年龄以其他单位"数字,两个日期被转换为完整天数的计数并乘以:
两个日期都首先固定在UTC午夜,因此夏令时更改无法添加或删除一小时并抛出天数。周数是天数÷7(向下舍入);小时、分钟和秒是天数的按比例放大。
为什么不直接用365除以天数? 因为你会漂移。用365除7,305天得到20.01年;用365.25除得到20.00——但都不知道哪些年是闰年,或者你实际上经历了哪些月份。日历计数很准确;日-除法是一个近似值。用日历年龄表示"我多大了",用总天数/周来做精确的经过时间工作(药物时间、项目持续时间、里程碑倒计时)。
实际例子
出生2000年1月1日,测量2020年1月1日:
| 测量 | 值 |
|---|---|
| 日历年龄 | 20年,0个月,0天 |
| 总天数 | 7,305 |
| 总周数 | 1,043 |
| 出生日期 | 星期六 |
7,305天 = 20 × 365 + 5个闰日(2000、2004、2008、2012、2016)。那个单一的细节——大多数人忘记的五个额外的日子——正是计算器胜过心算的原因。
代码中的年龄
每种语言中的相同计算。对于日历年龄,优先选择内置日期库而不是手工编写的算术——它已经知道闰年和月长。
1' 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"
61from 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 calendarAge(birth, target) {
2 let months = (target.getUTCFullYear() - birth.getUTCFullYear()) * 12
3 + (target.getUTCMonth() - birth.getUTCMonth());
4 const anchor = new Date(Date.UTC(birth.getUTCFullYear(), birth.getUTCMonth() + months, birth.getUTCDate()));
5 if (anchor > target) months--;
6 return { years: Math.floor(months / 12), months: months % 12 };
7}
8
9const birth = new Date(Date.UTC(2000, 0, 1));
10const target = new Date(Date.UTC(2020, 0, 1));
11const totalDays = Math.floor((target - birth) / 86400000); // 7305
121import java.time.LocalDate;
2import java.time.Period;
3import java.time.temporal.ChronoUnit;
4
5LocalDate birth = LocalDate.of(2000, 1, 1);
6LocalDate target = LocalDate.of(2020, 1, 1);
7
8Period age = Period.between(birth, target); // 20y 0m 0d
9long totalDays = ChronoUnit.DAYS.between(birth, target); // 7305
101using System;
2
3var birth = new DateTime(2000, 1, 1);
4var target = new DateTime(2020, 1, 1);
5
6int years = target.Year - birth.Year;
7if (birth.AddYears(years) > target) years--; // not birthday yet
8long totalDays = (target - birth).Days; // 7305
91#include <chrono>
2using namespace std::chrono;
3
4// C++20 calendar types
5sys_days birth = year{2000}/1/1;
6sys_days target = year{2020}/1/1;
7
8auto total_days = (target - birth).count(); // 7305
9years_months_days ymd_diff{birth, target}; // year_month_day arithmetic
101package main
2
3import "time"
4
5func main() {
6 birth := time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
7 target := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
8 totalDays := int(target.Sub(birth).Hours() / 24) // 7305
9 _ = totalDays
10}
111use chrono::{NaiveDate, Datelike};
2
3let birth = NaiveDate::from_ymd_opt(2000, 1, 1).unwrap();
4let target = NaiveDate::from_ymd_opt(2020, 1, 1).unwrap();
5
6let total_days = (target - birth).num_days(); // 7305
7let years = target.year() - birth.year(); // adjust if birthday not reached
81<?php
2$birth = new DateTime('2000-01-01');
3$target = new DateTime('2020-01-01');
4$diff = $birth->diff($target);
5
6echo "{$diff->y}y {$diff->m}m {$diff->d}d\n"; // 20y 0m 0d
7echo $diff->days; // 7305
81require 'date'
2
3birth = Date.new(2000, 1, 1)
4target = Date.new(2020, 1, 1)
5
6total_days = (target - birth).to_i # 7305
7years = target.year - birth.year
8years -= 1 if birth.next_year(years) > target
91birth <- as.Date("2000-01-01")
2target <- as.Date("2020-01-01")
3
4total_days <- as.integer(target - birth) # 7305
5常见问题
我到底多大了? 输入你的出生日期并将目标保持在今天。计算器显示你的年龄(以年、月和天为单位),并以总天数、周、小时和秒重复。
为什么我的年龄与另一个计算器不同? 几乎总是月/天的剩余部分。工具对如何计算月边界后最后一个完整月后的天数意见不一。这个是夹紧到较短的月份(relativedelta约定);按30除法的工具会相差一两天。
它处理闰年和2月29日生日吗? 是的。天数包括范围内的每个闰日,2月29日生日在非闰年中针对2月28日/ 3月1日进行测量,不会溢出。
我可以计算过去或未来日期的年龄吗? 是的——将"年龄日期"字段设置为任何日期。未来日期告诉你那时会有多大;过去日期,你当时的年龄。
时区呢? 日期在计数前归一化为UTC,因此无论你在哪里或夏令时是否改变,整个星期的总数都是稳定的。
来源
- Python
dateutil—relativedelta(此工具遵循的日历年龄月/日规则)。 - Java Platform —
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.