计算两个日期之间的天数:差一错误的陷阱
包含端点与不含端点的计数方式、为什么「距今天数」和「相隔天数」可能相差一天,以及银行、律师和计算器各自采用的惯例。
最后更新: 2026-07-15
当两个人计算同样两个日期之间的天数、得出相差一天的答案时,谁都没有算错。他们用的是不同的惯例。周一到周三之间的天数:如果你数的是日期之间的间隔(周一到周二、周二到周三),答案是 2;如果你数的是日期本身(周一、周二、周三),答案就是 3。前者叫作不含端点的计数,后者叫作包含端点的计数。二者都是对略有不同的问题给出的正确答案。
这就是差一陷阱的全部内容,它也解释了日期计算中的大部分困惑。AskTheDate 的差值计算器采用不含端点的惯例——它数的是你在所选时区里跨越的午夜数——所以周一到周三返回的是 2。下面,我们会逐一说明这一惯例在哪些地方要紧、为什么“距今天数”和“相隔天数”可能对不上,以及银行和法院所依赖的那些更为冷僻的天数计算规则。
包含端点与不含端点,具体来看
以 2026 年 1 月 5 日周一和 2026 年 1 月 7 日周三为例。把日期相减得到 2——这是不含端点的计数,即从 5 号开始到 7 号开始所流逝的整天数。而如果你问的是“如果我把 5 号、6 号、7 号都标出来,日历上被涂色的有几天”,答案就是 3,也就是包含端点的计数。经验法则是:只要你打算把两端都数进去,包含端点就等于不含端点加一。
你想要哪一个,完全取决于现实中的问题。“酒店预订住几晚?”是不含端点的——5 号入住、7 号退房,你付的是 2 晚。“会议开几天?”是包含端点的——一个从周一到周三的活动是为期 3 天的会议。同样两个日期,正确的数字却不同。
栅栏柱错误
这个错误的经典例子是一道栅栏。如果你要建一道 100 英尺长的直栅栏,每隔 10 英尺立一根柱子,需要多少根柱子?诱人的答案是 10。正确答案是 11,因为除了每一段 10 英尺的末端,最开头也需要立一根柱子。程序员把这一整类错误统称为“栅栏柱错误”或“差一错误”,而日期计算里到处都是这种错误:柱子就是日期,柱子之间的段落就是流逝的天数。
每当一个计数感觉本应是个整数,结果却少了一或多了一,栅栏柱通常就是罪魁祸首。解决之道不是去背某条规则,而是问问自己:你数的是柱子,还是间隔?
为什么“距今天数”不同于“相隔天数”
“距今天数”类的问题自带一套默认惯例,它和对称的两个日期之间的计数并不一样。当你问距某个事件还有几天时,通常的理解是不含今天(今天已经过了一部分)而含目标那天。在周二说“距周五还有三天”,指的是把周三、周四、周五当作这三天。
这就是为什么对同样一对日期,倒计时和差值计算可能相差一天。今天与目标之间纯粹的差值——即不含端点、按跨越午夜数计的那种——可能比你脑海里的倒计时读数少一,因为你脑海里把终点那天也算进去了。当你查看 距圣诞节还有多少天时,工具是有意这么做的:它数的是在你所在时区里到 12 月 25 日为止剩余的整天数,而不是把两端都含进去。
时区会悄悄改变计数
天数是按跨越的午夜数来计的,而午夜在不同地方发生在不同的绝对时刻。如果你在同一瞬间分别在东京和洛杉矶计算“从现在起”的差值,两地的时钟可能落在不同的日历日期上——东京可能已经领先一天——天数也就随之变化。正因如此,AskTheDate 把每一次计算都锚定在 URL 里某个特定的时区上,而不是锚定在服务器认为的当前时间上。只有当你固定了要跨越谁的午夜的那个时区,差值才有明确定义。
银行和律师是怎么数的
在日常用法之外,一些行业已经把它们的天数计算规范化了,这些惯例值得了解,因为它们并不是简单相减所得出的结果。
在金融领域,利息按约定的天数计算惯例(day-count convention)计提。在 实际天数/360(actual/360)下,你数的是实际流逝的天数,但除以一个 360 天的年,所以放贷方收取的利息会比按普通日历稍多一些。在 30/360 下,每个月都当作 30 天、每年都当作 360 天,这样无论某个月实际是 28、30 还是 31 天,债券票息都能得出干净、相等的金额。这两种惯例都不是日常意义上“天数”那回事;它们是让合同可以计算的、约定俗成的“虚构”。
法律有它自己的规则。许多体系中的截止期计算都不含时钟启动的那天,而含最后一天。在美国《联邦民事诉讼规则》中,第 6 条对此有明确规定:当一个期限以天数表示时,你不数触发它的那个事件当天,你数其间的每一天,并且数最后一天——除非最后一天是周末或法定假日,在这种情况下,截止日会顺延到下一个既非周末也非假日的日子。因此,一旦周末落在末尾,一个“14 天”的答复窗口实际可能跨越超过 14 个日历日。
加天数也有同样的陷阱
差一问题不仅限于测量间隔;一旦你往某个日期上加天数,它就会重新冒出来。“今天起 30 天”和“把今天算作第一天数到第 30 天”是不同的日期。给 2026 年 7 月 15 日周三加 30 天,落在 2026 年 8 月 14 日周五——这个加法不含起始日期,和差值计数完全一样。你可以在我们的 今天起加 30 天 页面上看到这一点;它是从当前日期往前推进整整 30 天,而不是把今天算作这 30 天里的第一天。
如果你的日期计算还得跳过周末,那么在节假日问题之上,同样的惯例问题也会适用,我们在 工作日是如何计算的中另作说明。
试一试
避免差一错误的可靠办法,是让一个明确说明自身惯例的工具去做计数。AskTheDate 的差值计算器数的是在固定时区里跨越的午夜数(不含端点的惯例),而它的 倒计时页面 采用的是“不含今天、含目标那天”的理解。挑选与你真正问题相符的那一个——是晚数还是天数,是间隔还是柱子——剩下的算术自会替你搞定。