要将日期差表示为日历年、月和日,请先计算完整日历月数,再计算剩余天数。本 Numbers 操作指南使用虚构的发布日期,并明确规定月末规则,方便你核对结果。
例如,按照下述方法,2022 年 5 月 18 日到 2025 年 9 月 24 日的间隔为 3 年 4 个月 6 天。你将创建一个可重复使用的电子表格,它还能处理 2 月、闰年以及 1 月 31 日这样的日期。
确定日历日期差的含义
计算日历日期差需要一个开始日期,以及一条逐月推进的规则。将经过的天数除以 365,再除以 30,无法保留日历边界:每个月和每年的长度都不相同。TC39 的日期 API 文档在解释为什么日期差默认以天为单位、除非请求更大的单位时,明确指出了这一区别。Temporal.PlainDate 文档。
本指南针对现代公历日期采用以下约定:
- 从较早的日期向较晚的日期计算。
- 找出不超过结束日期的最大整月偏移量。
- 如果目标月份有与开始日期相同的日号,就保留该日号;否则使用该月的最后一天。
- 每 12 个月换算为 1 年,然后计算锚点日期到结束日期之间的天数。
按照此约定,2025 年 1 月 31 日到 2 月 28 日为 1 个月。2025 年 1 月 31 日到 3 月 30 日为 1 个月零 30 天:两个月后的锚点将是 3 月 31 日,超过了结束日期。这些结果源于所选规则,并非对月份的普遍定义。
请按经过的日期计算,不要将首尾两天都计入。因此,相同日期的结果为 0 年、0 个月、0 天。如果你的任务是统计一个范围内包含多少个有日期的日历条目,那是另一种计算。
将民用日期与时间戳区分开
像 2025-09-24 这样的发布日期是民用日期:日历中的年、月、日。它不包含具体时间,也不表示某个时刻。像 2025-09-24T00:30:00+02:00 这样的时间戳包含时间和数字形式的 UTC 偏移量,因此可以标识一个时刻。RFC 3339 定义了相应的完整日期和日期时间语法。RFC 3339:互联网日期和时间:时间戳。
像 +02:00 这样的偏移量表示与 UTC 的时差。像 Europe/Paris 这样的命名时区提供了在时刻和当地时间之间转换的规则;适用的偏移量可能会变化。RFC 9557 区分了这些概念,并解释了为什么仅凭偏移量无法提供当地日历运算所需的规则。RFC 9557:互联网日期和时间:附加信息时间戳。
在此电子表格中,请直接输入预期的发布日期。如果来源中包含时间戳,请先确定哪个命名时区定义了发布日期,再将两个时间戳转换为该时区中的日期。例如,2025-09-24T00:30:00+02:00 与 2025-09-23T22:30:00Z 表示同一时刻;如果未先确定参考时区就采用显示日期,输入可能相差一天。
在 Numbers 中创建日期差工作表
你需要在 Mac 上使用 Numbers,并创建一个表格,其中包含从 A 到 J 的列以及至少两行。第 1 行填写标签,第 2 行进行计算。下方公式使用英文函数名和逗号分隔参数。
要输入公式,请选中目标单元格,输入或粘贴以 = 开头的公式,然后按 Return。Apple 说明,输入等号会打开 公式编辑器,而 函数浏览器 中提供函数帮助。在 Mac 上的 Numbers 中使用表格单元格中的数据计算值。
输入明确无歧义的开始和结束日期
将 A1 标记为 开始日期,将 B1 标记为 结束日期。输入以下虚构的发布日期:
| 单元格 | 公式 | 预期日期 |
|---|---|---|
A2 |
=DATE(2022,5,18) |
2022 年 5 月 18 日 |
B2 |
=DATE(2025,9,24) |
2025 年 9 月 24 日 |
使用 DATE(year,month,day) 可以避免不同地区对日期字符串的解读不一致。Apple 特别推荐使用此函数,以确保在不同地区设置下日期解读一致。请提供有效的日历日期,包括各月正确的天数。DATE。
继续之前,请确认结束日期与开始日期相同或晚于开始日期。此工作表专门计算正向日期差,不定义负的日历周期。
找出不晚于结束日期的最后一个日历锚点
按顺序在第 2 行输入以下标签和公式:
| 单元格 | 第 1 行标签 | 第 2 行公式 |
|---|---|---|
C2 |
候选月数 |
=(YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2) |
D2 |
完整月数 |
=C2-IF(DATE(YEAR(B2),MONTH(B2),MIN(DAY(A2),DAY(EOMONTH(B2,0))))>B2,1,0) |
E2 |
锚点月份起始日期 |
=EDATE(DATE(YEAR(A2),MONTH(A2),1),D2) |
F2 |
锚点日期 |
=DATE(YEAR(E2),MONTH(E2),MIN(DAY(A2),DAY(EOMONTH(E2,0)))) |
第一个公式计算两个年—月位置之间的距离。Apple 的 YEAR 和 MONTH 函数可从日期值中提取这些组成部分。YEAR、MONTH。
第二个公式会检查结束月份中的锚点。其日期号取开始日期的日号与该月最后一日中的较小值。如果候选日期晚于结束日期,公式就会减去一个月。此条件调整使用了 IF 的文档说明行为。IF。
剩余公式用于构建实际锚点。EDATE 会将开始月份的第一天按计算所得的偏移量移动,从而避免中间步骤出现无效日期。EDATE。
然后,工作表会明确应用月末规则:DAY 提取日号,EOMONTH 返回目标月份的最后一天,MIN 选取较小的日号。这样,公式清楚地显示了如何处理较短的月份。DAY、EOMONTH、MIN。
将结果表示为年、月和日
用以下公式完成工作表:
| 单元格 | 第 1 行标签 | 第 2 行公式 |
|---|---|---|
G2 |
年 |
=QUOTIENT(D2,12) |
H2 |
月 |
=MOD(D2,12) |
I2 |
日 |
=DATEDIF(F2,B2,"D") |
J2 |
日历日期差 |
=G2&" years, "&H2&" months, "&I2&" days" |
QUOTIENT 返回整数除法的结果,MOD 返回余数,从而将完整月数换算成年和剩余月数。QUOTIENT、MOD。
对于示例日期,D2 应为 40,F2 应表示 2025 年 9 月 18 日。该锚点到 9 月 24 日相差 6 天,因此结果为:3 年 4 个月 6 天。为简便起见,文本公式使用固定的复数标签;独立的数字列仍可用于其他计算。
检查月末和闰年
使用以下虚构日期对检查工作表是否遵循此约定。只替换 A2 和 B2 中的公式,其他公式保持不变:
| 开始日期 | 结束日期 | 预期年、月、日 | 锚点日期 |
|---|---|---|---|
| 2022 年 5 月 18 日 | 2025 年 9 月 24 日 | 3,4,6 | 2025 年 9 月 18 日 |
| 2025 年 1 月 31 日 | 2025 年 2 月 28 日 | 0,1,0 | 2025 年 2 月 28 日 |
| 2024 年 1 月 31 日 | 2024 年 2 月 29 日 | 0,1,0 | 2024 年 2 月 29 日 |
| 2024 年 2 月 29 日 | 2025 年 2 月 28 日 | 1,0,0 | 2025 年 2 月 28 日 |
| 2025 年 1 月 31 日 | 2025 年 3 月 30 日 | 0,1,30 | 2025 年 2 月 28 日 |
| 2025 年 9 月 24 日 | 2025 年 9 月 24 日 | 0,0,0 | 2025 年 9 月 24 日 |
这些示例是在所述规则下计算得出的。锚点算法经过确定性 Python 计算核对,其中包括 10,000 组生成的日期对;Numbers 界面本身未实际运行。
通过重建计算路径来核对结果:从原始开始日期出发,按照所述月末规则,按 D2 中的总月数移动,然后再向后推移 I2 中的天数。你应当能得到结束日期。始终从原始开始日期计算月份锚点:逐月推进可能会在经过 2 月后丢失原始日号。
为什么不把三个 DATEDIF 结果合并?
Apple 记录了 DATEDIF 的选项,分别用于计算年数、忽略年份的月数,以及忽略月和年份的天数。"MD" 选项使用特定的日号计算方式,其中涉及替换月份。因此,不应假定它表示按照你所选的月末调整规则计算出的剩余天数。此工作表仅在明确的锚点与结束日期之间使用 "D"。DATEDIF。
将此操作映射到日期 API
对于实现此任务的软件,TC39 记录了仅包含日期的类型 Temporal.PlainDate,以及考虑日历规则的日期差运算。使用 largestUnit: 'year' 请求 until,会得到以年和更小单位表示的时长;保留默认选项则会按天计算日期差。文档还说明了受限的月份加法,并规定如果两个日期使用不同的日历系统,除非先将它们转换到同一日历,否则会拒绝计算日期差。Temporal.PlainDate 文档。
这些 API 选择也突显了工作表的关键决策:确定输入是否仅为日期、选择日历、指定最大单位,并保留锚点以解释月份。日期字符串标准描述的是表示形式;仅选择一种表示形式并不会决定任务所用的月末规则。
使用结果前排查意外情况
如果公式出错,请选中错误指示符以查看消息;Apple 的 Numbers 指南记录了这项诊断步骤。请检查单元格引用,并使用 函数浏览器 插入参数,以应对你的安装版本可能要求使用不同公式分隔符的情况。在 Mac 上的 Numbers 中使用表格单元格中的数据计算值。
如果计算结果看起来合理,但与其他工具不同,请对比其月末规则与本工作表的规则。还要检查其他工具是否将首尾两天都计入、使用时间戳而非民用日期,或对结果进行了舍入。请勿将反向日期和空白输入代入此正向计算,也不要用零替代错误。
若要重复比较发布日期,请将开始日期、结束日期和锚点与最终表述一同保留。它们能让“3 年 4 个月 6 天”这样的结果追溯到具体的日历计算。
来源
- 在 Mac 上的 Numbers 中使用表格单元格中的数据计算值 — Apple。
- DATE — Apple。
- YEAR — Apple。
- MONTH — Apple。
- IF — Apple。
- EDATE — Apple。
- DAY — Apple。
- EOMONTH — Apple。
- MIN — Apple。
- QUOTIENT — Apple。
- MOD — Apple。
- DATEDIF — Apple。
- Temporal.PlainDate — Ecma TC39。
- RFC 3339:互联网日期和时间:时间戳 — RFC Editor。
- RFC 9557:互联网日期和时间:附加信息时间戳 — RFC Editor。