咱们好,我是煎鱼。
前段时刻我写了一篇《Go1.20 中两个关于 Time 的更新,总算不必背 2006-01-02 15:04:05 了!》,文中有说到 Go 的参阅时刻格局是:2006-01-02 15:04:05,并解释这么设计的缘由。
有很多同学表明不解。如下图:
甚至我在点外卖时还特意看了,某团在个人信息页中的生日那一栏,是如此显示的:
那了解的 yyyy-mm-dd。我甚至一度置疑这是不是 BUG,这或许只有程序员懂?
ISO 8601 标准
尤其是有说到 ISO 8601,这是一个世界标准化组织供给的一个有关时刻表明的标准,其间咱们最为了解的是日期表明法。
具体介绍摘抄自网络,如下:
YYYY-MM-DDThh:mm:ss[.mmm]TZD
2022-11-18T10:05:45+08:00
- YYYY:四位数年份,不全补齐。
- MM:月份、两位,不全补齐。
- DD:两位数的天(day of the month),01~31。
- T:指示时刻元素的开始字符。
- hh:两位数的小时,00~23。
- mm:两位数的分钟,00~59。
- ss:两位数的秒,00~59。
- mmm:三位数的毫秒,000~999。
- TZD:时区指示符:Z 或 +hh:mm 或 -hh:mm,+ 或 – 表明时区距离 UTC 时区多久。
为什么这么特别
咱们之前的文章都在介绍 2006-01-02 15:04:05 这个时刻点代表的含义是什么,代表什么意思:
Jan 2 15:04:05 2006 MST
1 2 3 4 5 6 -7
这有一个大大的问题,那就是 Go 为什么不遵守 ISO 8601 标准,非得用这个?这莫非是一种新的创新…
在我猛翻后,找到了在对标准化辩解的背后。实际上 @Rob Pike 在 2014 年在《What is the reason behind time.Parse using a reference time?》进行了解释,阐明为什么会挑选这个时刻点。
“这个挑选是由我的 Unix 机器上的 date 命令的输出所决议的。我应该意识到格局会随着区域的不同而变化。错了。但我依然能够说它很容易记住,而且有据可查。”
这就是原因。
为什么那么难受
咱们一开始或许认为只有咱们用的比较变扭?但其实不止,各地的人都拥到了社区里反馈过这个问题。
归根结底仍是世界各地用的时刻格局不一样,而 Go 这里依据 Rob 的反馈,实际上它只是以某国为时刻中心的 “随机” 格局,对应的就是 “1 2 3 4 5 6 7”。
例如:“Jan 2 3:04 pm 06 -0700”。
所代表的含义:
- Jan:榜首个月
- 2:第二天
- 3:下午 3 点
- 4:第 4 分钟
- 5:第 5 秒
- 6:本世纪第 6 年
- 7:比格林威治标准时刻晚 7 小时。
看起来很有规律,但…
总结
Go 的这一项时刻标准挑选,是比较特殊的。很多同学期望他 “改邪归正”,用回 YYYY-MM-DD,别再用 2006-01-02 15:04:05 了。
这显然不现实,首先是 Go1 兼容性不允许,其次一山不能容二虎,加估量都没法加。这件事已成定局。
主张仍是记好 Go1.20 要新增的 3 个常量,这个以后不必去背和查了。如下:
DateTime = "2006-01-02 15:04:05"
DateOnly = "2006-01-02"
TimeOnly = "15:04:05"
这个比较现实。
这个设计,我认为是技能债务了。将会持续陪伴 Go1 终身,你我皆为局中人。
Go2 有戏吗?暂未看到。
推荐阅读
- Go1.20 中两个关于 Time 的更新,总算不必背 2006-01-02 15:04:05 了!
- 打脸了兄弟们,Go1.20 arena 来了!
- Go 十年了,总算想起要统一 log 库了!