倒计时与纪念日

填一个目标日期,看它距今天还有多少天,或者已经过去了多久。按日历日计算,跨夏令时也不会差一天。

两个日期都按本地日历日计算,不换算时区,也不受夏令时切换影响。

使用说明

核心结果只有一个数字:目标日期减参照日期的日历日差。未来为正,显示成「还有多少天」;过去为负,显示成「已经过去多少天」。今天是同一天时两个口径都不适用,单独提示。这个数字不含时区换算——不管你在哪个时区打开,同一个日期算出来都是同一天数,因为计算前会先把日期归到当天零点,只比较年月日。

按日历日相减而不是拿两个时间戳直接除,是为了避开夏令时。夏令时开始和结束的那两天只有 23 小时或 25 小时,用毫秒除 86400 会得到 0.958 或 1.042,四舍五入后可能少一天或多一天。这里改用 Date 的年月日字段构造出当地零点再相减,日历日是整数,不会出现这种偏差。

「拆成日期」那一栏用的是日历字段逐级推进,不是按每月 30 天估算。它会先算相差几个月,余下的天数如果不够就从上一个自然月借——所以 1 月 31 日到 3 月 1 日会得到 1 个月零 1 天,因为借的是 2 月的 28 天。这也是日历应用里「相差 1 个月 1 天」的常见口径。

工作日统计只按周一至周五计算,不包含法定节假日,也不处理调休上班的周末。春节、国庆这类长假期间的工作日天数会明显偏多,排工期时要注意这一点;需要按真实放假安排算,用工作日计算工具。另外要注意工作日那一栏是含两端的口径,想只数中间的天数就减 2。

常见用法是算考试倒计时、放假倒计时、纪念日已经过去多少天,或者产品上线的交付倒计时。要看两个日期之间的详细间隔和差额分解,用日期间隔计算;要在一个日期上加减若干天倒推日期,用日期加减;要按工作日排项目进度,用工作日计算;想知道某人现在多大,用年龄计算。

常见问题

算出来差一天,是谁算错了?

多半是「含不含今天」的口径不同。这里的总天数是目标日期减去参照日期的纯日差:今天到明天算 1 天,今天到今天算 0 天。如果你习惯把今天也算进去,把结果加 1 就行。工作日那一栏已经把两端口径标在旁边,可以直接对照。

跨夏令时会算错吗?

不会。计算前会先把两个日期都归到当天 00:00,再用日历日做差,而不是拿两个时间戳直接相减。夏令时切换那天只有 23 小时或 25 小时,用时间戳相减会得到 0.958 或 1.04 天,四舍五入就可能差一天,这种算法避开了这个坑。

这里算的工作日包含法定节假日吗?

不包含。工作日只按周一至周五统计,没有抽取春节、国庆这类法定节假日,也没有处理调休上班的周末。要按真实节假日算,需要一份每年的放假安排数据,那属于「工作日计算」工具的职责范围。

为什么月份那栏和我手数的不一样?

因为月份是按日历字段逐级推进的,不是按每 30 天估一个月的。例如 1 月 31 日到 3 月 1 日,这里会算成 1 个月零 1 天:先借 2 月的 28 天补上 1 月 31 日的差额,再进一个月。按平均月长估算会得到 0.96 个月,反而不符合日常说法。

可以算某个日期已经过去多久吗?

可以。目标日期填一个过去的日期,结果会自动切换成「已过」口径,显示已经过了多少天、多少周,以及距离那个日期已经满了几周年。填未来的日期则是倒数口径,同一套算法,只是方向不同。

倒计时的结果为什么不能精确到秒?

因为页面算的是「日历日」的差,不是「剩余时间」。距离明天零点还有 8 小时还是 20 小时,按天算都是 1 天。要精确到时分秒的剩余时间,用日期加减那一类的工具更合适,或者直接用秒表倒计时。

相关:日期间隔计算日期加减

2 月 29 日这类日期能填吗?

能填,但只在该年确实有这一天时才算合法。例如填 2025-02-29 会提示日期不存在,因为 2025 年不是闰年;填 2028-02-29 则可以。工具会反查一遍年月日是否和输入一致,自动进位成 3 月 1 日的写法会被挡下来,免得倒计时默默算错。

常用来算哪些日子?

最常见的几类是:距离考试、放假、发工资的日子还有多少天;恋爱或结婚纪念日已经过了多少天、快到第几周年;产品上线、项目交付、试用期结束的倒计时。需要看两个日期之间的详细间隔,用日期间隔计算;要按工作日排进度,用工作日计算。

相关:工作日计算年龄计算