跳到正文
简体中文
工作台什么都不上传的工具
ODERSA 协会的一间工坊什么都不外传,什么都不留存,什么都到不了我们手里。

工坊 · 日期计算

怎么用 : 日期计算

所有计算都放在世界时的正午做,绝不放在本地时间的午夜:在午夜,一次夏令时切换就能把日期整整挪走一天,而这正是让人莫名其妙错过期限的那个错误。

打开工具

日期计算看着简单,其实不是。有两个坑绊倒了大多数工具:一个是夏令时切换,它会让某一天短掉六十分钟,如果计算从午夜起步,结果就会整整错开一天;另一个是加月份,从 1 月 31 日往后加一个月,本来就没有唯一答案。

所以这件工具一律在世界时的正午做计算。这样一来,加一天永远就是一天,不管在哪个时区,也不管中间跨过了什么样的时间切换。而当一个问题没有唯一答案时,它会说出来,把两个可能的答案都摆给您看,而不是悄悄替您选一个。

您在这里找不到法定节假日,这是一个决定,不是疏漏。各国不一样,同一个国家有时各地区也不一样,日期还年年变,碰上周末又会另外补一个假日。写死在工具里的一张表,十二个月就烂了,而信了它的人会算出一个错的期限。

怎么用

  1. 先选要算什么,然后按年、月、日的顺序输入日期,中间用短横线隔开。
  2. 每改一处,结果就跟着更新,并且把算了些什么一条条列出来。
  3. 日期格式用的是国际标准,这是有意的:“03/04”在世界的一半地方是 4 月 3 日,在另一半是 3 月 4 日。

支持的格式

这件工具既不收文件也不收文字。日期按年-月-日输入,也就是国际标准的写法,因为它没有歧义,而且天然可以排序。

什么都不用放进来

输入两个日期,或者一个日期加一个数字。工具里没有内置任何节假日表,原因写在限制里。

查看兼容性对照表

它的限制

工具里没有内置任何法定节假日

各国不一样,同一个国家有时各地区也不一样,日期年年变,节假日碰上周末,很多地方还会另外补一天,而且是逐年逐例定的。比如英国的官方日历就明确公布“补休日”,苏格兰和英格兰的清单还各是各的。写死的一张表,十二个月之后就是错的,而这个项目面向的是全世界的人:所以这里数的工作日就是周一到周五,没有别的。这一点我们说清楚了,您的节假日要自己手动减掉。

加月份没有唯一答案,工具会把两个都给您

1 月 31 日之后一个月,大多数软件给的是 2 月 28 日,也就是回退到当月最后一天;也有软件让它往后溢出,给 3 月 3 日。两个答案都不算错:是问题本身没提清楚。所以两者不一致时,工具会把两个都显示出来,并写明各自依的是哪条规则,而不是替您做主。

日期标准的正文是要花钱买的,我们没有读过

周次编号来自国际标准 ISO 8601,它的正文卖大约 180 瑞士法郎。我们没有读过。由它派生出来的那份免费 IETF 文档自己就写着,这个标准的完整语法对大多数用途来说太复杂,而且它根本没有涵盖周次编号。我们照着浏览器脚本语言规范里的写法来做,那份规范是免费的:第 1 周就是含有 1 月第一个星期四的那一周。这跟 QR 码标准那件事是同一个交代:我们把没读过的东西说出来。

1582 年 10 月之前,这里用的历法根本不曾存在过

浏览器算的是向过去外推的格里历,也就是把它套用到还没启用它的那些世纪上。所以这件工具给出的 1500 年的某个日期,跟当时的人写下的日期对不上,差距能到十来天。这不是工具的毛病,这就是所用历法的定义;一件日期工具如果不说这句话,就是让人以为它有一种它并不具备的历史准确性。

日期是打进去的,没有可以点的日历

本站的视觉规范里没有画过日期控件,而浏览器自带的日期控件进来时不带我们任何样式,边框和高度都是它自己的一套:规范已经冻结,我们不会为了一件工具去动它。而且手打格式还有个实实在在的好处:“03/04”在世界的一半地方指 4 月 3 日,另一半指 3 月 4 日,而国际格式压根不会引起误会。

可用的日期范围在 1970 年前后各约 273000 年

这是脚本语言规范保证的范围,工具会把它显示出来。超出这个范围,浏览器给出的就不是日期而是一个无效值,工具会直说,而不是显示一片空白。

关于这个工具的问题

我输入的日期会被发到什么地方吗?

不会,而且这里压根没有什么可发的:工具只做计算。按 F12 打开开发者工具,切到“网络”标签页,清空列表,然后想算多少次就算多少次,列表一直是空的。这件事比看上去重要:出生日期、开庭日期、复诊日期都是敏感信息,而一个普通的在线计算器是会收到它们的。

为什么按正午算,不按午夜算?

因为夏令时切换那天不是二十四小时。如果计算从午夜起步、按小时往上加天数,它会按切换的方向落到二十三点或者凌晨一点,显示出来的日期就跳掉一天。从正午起步,两边各留了十二小时的余量:已知的时间切换没有超过两小时的。这是程序员的一个老办法,也正是它避开了日期计算里最常见的那一类错误。

为什么加月份有时会给出两个答案?

因为这个问题没有唯一答案。1 月 31 日之后一个月:2 月 31 日不存在。有些软件回退到 2 月 28 日或 29 日,有些让它往后溢出到 3 月 3 日。这两种做法在真实的业务软件里都有,悄悄选一种,就会让我们一半的访客拿到一个错的期限。所以工具把两个都显示出来,并写明各自出自哪条规则,由您按合同或者主管部门的做法去挑。

为什么没有法定节假日?

因为节假日表是一件工具里烂得最快的部分。各国不一样,同一国的各地区有时也不一样,日期年年在动,节假日碰上周六,好些国家还会逐例补一天。内置一张表,等于承诺每年为全世界所有国家把它维护好。我们宁可就数周一到周五的工作日,把话说明白,让您自己减掉节假日:您做的这道减法是对的,而一张过期的表会让您错过期限。

你们给的周次是对的吗?

它是国际标准的周次,按被广泛写明的那条规则算:第 1 周是含有 1 月第一个星期四的那一周,一周从星期一开始。要知道另外的约定也存在、而且同时在用:在世界的一部分地方,一周从星期日开始,第 1 周是含有 1 月 1 日的那一周。所以这里显示的周次,可能跟您的电子表格或者日程软件不一样,看它们怎么设的。我们也说清楚了:那份标准的正文是要花钱的,我们没有读过。

我可以算出准确的年龄吗?

可以,用两个日期相差多少:工具会给出天数,再给出整月数加余下的天数,年龄本来也是这么说的。不过要留神跟加月份一样的那个含糊之处:2 月 29 日出生的孩子,生日怎么定要看国家,这一点任何计算都替您断不了。