Go 憑什么搞特殊?不用 yyyy-mm-dd,非得要 2006-01-02 15:04:05......
大家好,我是煎魚。
前段時間我寫了一篇《??Go1.20 中兩個關(guān)于 Time 的更新,終于不用背 2006-01-02 15:04:05 了!????》,文中有提到 Go 的參考時間格式是:2006-01-02 15:04:05,并解釋這么設(shè)計的緣由。
有很多同學(xué)表示不解。如下圖:
甚至我在點(diǎn)外賣時還特意看了,某團(tuán)在個人信息頁中的生日那一欄,是如此顯示的:
那熟悉的 yyyy-mm-dd。我甚至一度懷疑這是不是彩蛋,這可能只有程序員懂?
ISO 8601 規(guī)范
尤其是有提到 ISO 8601,這是一個國際標(biāo)準(zhǔn)化組織提供的一個有關(guān)時間表示的規(guī)范,其中我們最為熟悉的是日期表示法。
具體介紹摘抄自網(wǎng)絡(luò),如下:
- YYYY:四位數(shù)年份,不全補(bǔ)齊。
- MM:月份、兩位,不全補(bǔ)齊。
- DD:兩位數(shù)的天(day of the month),01~31。
- T:指示時間元素的開始字符。
- hh:兩位數(shù)的小時,00~23。
- mm:兩位數(shù)的分鐘,00~59。
- ss:兩位數(shù)的秒,00~59。
- mmm:三位數(shù)的毫秒,000~999。
- TZD:時區(qū)指示符:Z 或 +hh:mm 或 -hh:mm,+ 或 - 表示時區(qū)距離 UTC 時區(qū)多久。
為什么這么特別
我們之前的文章都在介紹 2006-01-02 15:04:05 這個時間點(diǎn)代表的含義是什么,代表什么意思:
這有一個大大的問題,那就是 Go 為什么不遵守 ISO 8601 規(guī)范,非得用這個?這莫非是一種新的創(chuàng)新...
在我猛翻后,找到了在對標(biāo)準(zhǔn)化辯解的背后。實(shí)際上 @Rob Pike 在 2014 年在《What is the reason behind time.Parse using a reference time?[1]》進(jìn)行了解釋,說明為什么會選擇這個時間點(diǎn)。
“這個選擇是由我的 Unix 機(jī)器上的 date 命令的輸出所決定的。我應(yīng)該意識到格式會隨著地區(qū)的不同而變化。錯了。但我仍然可以說它很容易記住,并且有據(jù)可查?!?/p>
這就是原因。
為什么那么難受
大家一開始可能以為只有我們用的比較變扭?但其實(shí)不止,各地的人都擁到了社區(qū)里反饋過這個問題。
歸根到底還是世界各地用的時間格式不一樣,而 Go 這里根據(jù) Rob 的反饋,實(shí)際上它只是以某國為時間中心的 “隨機(jī)” 格式,對應(yīng)的就是 “1 2 3 4 5 6 7”。
例如:“Jan 2 3:04 pm 06 -0700”。
所代表的意義:
- Jan:第一個月
- 2:第二天
- 3:下午 3 點(diǎn)
- 4:第 4 分鐘
- 5:第 5 秒
- 6:本世紀(jì)第 6 年
- 7:比格林威治標(biāo)準(zhǔn)時間晚 7 小時。
看起來很有規(guī)律,但...
總結(jié)
Go 的這一項(xiàng)時間規(guī)范選擇,是比較特殊的。很多同學(xué)希望他 “改邪歸正”,用回 yyyy-mm-dd,別再用 2006-01-02 15:04:05 了。
這顯然不現(xiàn)實(shí),首先是 Go1 兼容性不允許,其次一山不能容二虎,加估計都沒法加。這件事已成定局。
建議還是記好 Go1.20 要新增的 3 個常量,這個以后不用去背和查了。如下:
這個比較現(xiàn)實(shí)。
這個設(shè)計,我認(rèn)為是技術(shù)債務(wù)了。將會持續(xù)陪伴 Go1 終身,你我皆為局中人。
Go2 有戲更正嗎?暫未看到。