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

比特青焰引
• 阅读 3548

大家好,我是煎鱼。

前段时间我写了一篇《Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!》,文中有提到 Go 的参考时间格式是:2006-01-02 15:04:05,并解释这么设计的缘由。

有很多同学表示不解。如下图:

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

甚至我在点外卖时还特意看了,某团在个人信息页中的生日那一栏,是如此显示的:

Go 凭什么搞特殊?不用 yyyy-mm-dd,非得要 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?》进行了解释,说明为什么会选择这个时间点。

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

这个选择是由我的 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 有戏吗?暂未看到。

推荐阅读

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
MYSQL主从同步故障解决(主键重复)
MYSQL主从同步故障解决(主键重复)转载2010年04月05日18:52:00标签:mysql(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%2Fs.do%3Fq%
Stella981 Stella981
3年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
比特青焰引
比特青焰引
Lv1
因为她才一米六,所以一旦吵架了,我就必须先低头。
文章
3
粉丝
0
获赞
0