Go 凭什么搞特殊?不用 yyyy-mm-dd,非得要 2006-01-02 15:04:05。。。

大家好,我是煎鱼。

前段时间我写了一篇《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 有戏吗?暂未看到。

推荐阅读


煎鱼的清汤锅
今天写代码了吗 :-) 博客地址:[链接]
8.2k 声望
12.7k 粉丝
0 条评论
推荐阅读
Go1.20 那些事:PGO、编译速度、错误处理等新特性,你知道多少?
最近 Go1.20 在 2 月 1 号已经正式发布,来的挺早的,以往都是拖到月底的,我翻了好几篇,发现最后还是做了不少功能取舍,放了些新特性(例如:arena 等)的鸽子!

煎鱼1

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木66阅读 6.2k评论 16

如何使用 PHPStorm 进行优雅的项目开发?
PHP Storm 这个开发工具,很多 phper 应该有所耳闻,甚至也有不少人使用其作为生产工具,但是很多人都没有最大限度的使用它,本文就来总结一些优雅开发的小技巧。

唯一丶45阅读 4.8k评论 7

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木44阅读 7.4k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木33阅读 6.2k评论 9

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 4.6k评论 9

怎样用 PHP 来实现枚举?
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,...

唯一丶25阅读 6.4k评论 4

8.2k 声望
12.7k 粉丝
宣传栏