该测试哪一天?
日期测试有一半是拨动时钟,另一半是知道该把它拨到哪里。在线计算器能告诉你从今天起九十天后是哪一天,却不会告诉你那一天是银行假日,或者是这个季度的最后一天。
04/08/2008,两种读法都会显示,而不是猜其中一种。工作日,附带真实的节假日
“十个工作日之后”不是算术题——这取决于你按哪个国家的日历来数。起始日期相同、同样十天,却有两个不同的答案:
$ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar us-banking result: 2027-09-16T00:00:00 $ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar pl result: 2027-09-15T00:00:00
差了一天,如果你问计算器中间那一天是什么情况,它会告诉你原因:
$ chrono calc --base 2027-09-06T00:00:00 --calendar us-banking metadata: weekday Monday business day no (us-banking) holiday Labor Day what this date lands on: public holiday (weekend and holiday marks follow the us-banking calendar)
美国和波兰作为参考日历内置,选它们是因为两者加起来涵盖了所有规则类型:固定日期、“每月第 N 个星期几”、由复活节推算的日期,以及美国的规则——落在星期六的节假日改在前一个星期五。新增一个国家只需要一个数据文件,而不是改代码。
一次列出所有格式
被测应用需要什么形式的日期,就要什么形式。计算器不让你自己去转换,而是把它们全部打印出来——对不符合任何标准的格式,还有自定义掩码。
$ chrono calc --preset year-2038 --zone +00:00 Chrono Mock - date calculator preset: year-2038 - 2038 boundary explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)? result: 2038-01-19T03:14:07 formats: ISO date 2038-01-19 ISO datetime 2038-01-19T03:14:07+00:00 US 01/19/2038 PL 19.01.2038 epoch (s) 2147483647 epoch (ms) 2147483647000 FILETIME 137919572470000000 RFC 1123 Tue, 19 Jan 2038 03:14:07 GMT ... what this date lands on: at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)
这个纪元值并非巧合——2147483647 恰好是有符号 32 位整数能容纳的最大数,这就是这个日期之所以重要的全部原因。
反向解读一个日期
反方向同样有用:从日志里粘贴一个日期,弄清它到底是什么。当格式有歧义时——04/08 在世界上一半的地方都有歧义——两种读法都会显示,而不是猜其中一种,因为最初的缺陷报告正是源于猜测。
$ chrono calc --analyze 04/08/2027 Chrono Mock - date analysis input: 04/08/2027 (ambiguous - month/day order differs by locale) US MM/DD/YYYY: 2027-04-08 (Thursday) PL DD/MM/YYYY: 2027-08-04 (Wednesday)
相隔四个月,星期几也不同。ISO 日期没有歧义,会按 ISO 日期来读,而根本不是日期的内容则会被拒绝,而不是去猜。
由步骤构成,而不是一句话
一个时刻就是一个起点加上若干步骤,每一步之后都会显示中间结果,所以一个得出意外答案的表达式会让你看到是在哪里拐了弯。共有五种步骤:按某个单位偏移、设定一天中的时间、对齐到某个周期边界、移到最近的工作日,以及换一个时区重新表示。
# 一年翻篇前的最后一秒 chrono calc --base today --snap eoy # 九十个工作日之后,使用美国银行业日历 chrono calc --base today --shift +90bd --calendar us-banking # 往回推十八年零一天,用于年龄检查 chrono calc --base today --shift -18y --shift -1d
任何算出来的日期都可以直接送进替换会话,--json 则以机器可读的形式输出同样的结果。
值得测试的日期 →