要将日期差表示为日历年、月和日,请先计算完整日历月数,再计算剩余天数。本 Numbers 操作指南使用虚构的发布日期,并明确规定月末规则,方便你核对结果。

例如,按照下述方法,2022 年 5 月 18 日到 2025 年 9 月 24 日的间隔为 3 年 4 个月 6 天。你将创建一个可重复使用的电子表格,它还能处理 2 月、闰年以及 1 月 31 日这样的日期。

确定日历日期差的含义

计算日历日期差需要一个开始日期,以及一条逐月推进的规则。将经过的天数除以 365,再除以 30,无法保留日历边界:每个月和每年的长度都不相同。TC39 的日期 API 文档在解释为什么日期差默认以天为单位、除非请求更大的单位时,明确指出了这一区别。Temporal.PlainDate 文档。

本指南针对现代公历日期采用以下约定:

  1. 从较早的日期向较晚的日期计算。
  2. 找出不超过结束日期的最大整月偏移量。
  3. 如果目标月份有与开始日期相同的日号,就保留该日号;否则使用该月的最后一天。
  4. 每 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 天”这样的结果追溯到具体的日历计算。

来源