工作原理
“两个日期的差值”里其实藏着两个不同的问题。精确经过时长是一个固定的毫秒数,可以干净地换算成天、小时和分钟。日历差值则是人们口中“三年零两个月”的意思,它取决于日期落在哪里:从 1 月 31 日到 2 月 28 日是日历上的一个月,而从 1 月 31 日到 3 月 3 日同样也是。本工具两者都给出,因为一份“为期一个日历月”的合同和一份“为期 28 天”的合同确实是不同的约定。
日历差值采用借位法计算,就像学校里的减法。当结束日期的“日”小于开始日期的“日”时,从“月”借一位,并加上上个月的天数——这就是算法必须知道 2024 年 2 月有 29 天而 2025 年 2 月只有 28 天的原因。算错这一点,正是计费系统和年龄计算在边界处出现“差一天”错误的原因。例如 2 月 29 日出生是一个著名的边界情形:有些司法管辖区把非闰年的 2 月 28 日视为生日,另一些则用 3 月 1 日。
工作日计数是日历上的算术,而不是数轴上的算术。先按可配置的掩码剔除周末,因为工作周并非处处都是周六周日——中东许多地区是周五和周六。再从剩余集合中剔除法定节假日,同时考虑落在周末的节假日不会额外减少一个工作日,以及部分国家存在调休。最终得到的正是项目经理或 SLA 计算真正需要的数字。
反方向的时长加法有自己的陷阱。1 月 31 日加一个月得到的是 2 月 28 日或 29 日,而不是 2 月 31 日,因此“日”会被夹取到目标月的最后一天;闰年的 2 月 29 日加一年得到 2 月 28 日。相比之下加天数是直截了当的,因为一天是固定长度——唯一例外是跨越夏令时切换时当地时间会平移一小时而日期不变,这也是本工具在日历问题上按日历日期而非经过毫秒进行运算的原因。
常见应用场景
- 计算距离截止日期、续约日或产品发布还剩多少天。
- 为表单或档案计算精确到年月日的年龄。
- 统计项目周期内的工作日,排除周末与法定节假日。
- 为发票或通知期推算九十天后的到期日。
- 确认订阅周期是按日历月还是按天数计算。
- 按年月计算员工入职时长,用于服务年限奖励。
最后更新: 2026-10-14