Go1.20 中兩個關(guān)于 Time 的更新,終于不用背 2006-01-02 15:04:05 了!
大家好,我是煎魚。
Go 語言中有一個東西是比較有特色的,那就是 time 標(biāo)準(zhǔn)庫,在各類與時間有關(guān)的場景都會常常用到,例如:定時/延遲任務(wù)、數(shù)據(jù)更新、時間比較。
官方 Demo 是一個計算時間差的樣例:
輸出結(jié)果:
神秘的 2006-01-02 15:04:05
在社區(qū)反饋中,更虎的是以下這個樣例:
輸出結(jié)果:
這時候大家會遇到幾個問題...最被常問的是 2006-01-02 15:04:05,這是隨便寫的時間點嗎,甚至還曾經(jīng)有傳言說這是 Go 語言的誕生時間...
為什么是這個時間點
實際上 2006-01-02 15:04:05 是一個參考時間的格式,也就是其它語言中 Y-m-d H:i:s 格式,在功能上用于時間的格式化處理和規(guī)范。
那為什么是 2006-01-02 15:04:05 呢?其實這些 ”數(shù)字“ 是有意義的,每個布局字符串都是一個時間戳的表示,并非隨便寫的時間點。
可參見官方例子中的如下方式:
我們也可以將其記憶為 2006 年 1 月 2 日 3 點 4 分 5 秒。
確實背不下來,快優(yōu)化
雖然 Go 官方給出了一系列感覺很合理的解釋,也通過上面的方式試圖教會大家靠理解而不是靠純背把這個時間點格式規(guī)范給記下來...
現(xiàn)實是很殘酷的,母語不同,業(yè)務(wù)類型不同,不會經(jīng)常用到 time 標(biāo)準(zhǔn)庫,很容易忘記具體數(shù)值。
大佬也分析了 Go modules 上的所有模塊代碼,發(fā)現(xiàn)這個日期時間點,使用的次數(shù)非常高頻:
排名 | 頻率 | 格式 |
1 | 75616 | time.RFC3339 |
2 | 23954 | time.RFC3339Nano |
3 | 13312 | "2006-01-02 15:04:05" |
4 | 12332 | "2006-01-02" |
5 | 11940 | time.RFC1123 |
綜上數(shù)據(jù)所述,終于在 Go 過去了 13 年后,將會在 Go1.20 增加如下三個常量:
新版本中直接引用即可。
以后問這是什么意思的同學(xué),可能會變少。
支持比較:Time.Compare
目前在標(biāo)準(zhǔn)庫中,有 3 個方法來比較 time.Time 對象,分別是:Before()、Equal() 和 After(),作用上類似 <、== 和 >。但缺少 <= 和 >= 的等價物,因此在程序中實施起來會比較麻煩。
經(jīng)常一番討論,將會在 Go1.20 支持 Time.Compare,以此來達到類似的效果。作用是將 Time 對象 t 和 u 兩者進行比較。
函數(shù)返回如下幾種結(jié)果:
- 如果 t 在 u 之前,則返回 -1。
- 如果 t 在 u 之后,則返回 +1。
- 如果它們相同,則返回 0。
源代碼如下:
函數(shù)內(nèi)部比較簡單。
總結(jié)
Go Time 一直都是話題榜上的老面孔。這一次在 Go1.20 的新特性中,對 2006-01-02 15:04:05 常用的時間點進行了常量聲明,便于我們后續(xù)直接引用,不用 “死記硬背”。
在 Time 對象的比較上,也補全了 Compare 方法,便于兩個時間對象之前之后的對比。
Go1.20 將在明年 2023 年 2,3 月份左右就可以見到了。11 月底會發(fā)預(yù)覽版本。沖不?