Go 的時間格式化為什麼是 2006-01-02 15:04:05?

2022-02-02 polarisxu

收錄於話題 #Golang 89個

大家好,我是 polarisxu。

沒有什麼是完美的!而且,有些東西,有些人認為好,有些人認為很糟糕。Go 也是如此。喜歡 Go 語言的朋友,大概率對其中某些地方不喜歡。比如,你喜歡 Go 中時間格式化固定的 2006-01-02 15:04:05 -0700 嗎?為什麼是這麼一個時間?今天來一探究竟!

01 新手的困惑

無論是各種群裡還是網上搜一下,包括國外的,對 2006-01-02 15:04:05 -0700 都很困惑。

一般的困擾主要有:

不知道只能固定要這個時間,換其他的,出來的結果莫名其妙,然後一臉懵逼;為什麼沒有像其他語言一樣,yyyy-mm-dd 這樣的形式?這個時間有什麼特殊意義嗎?為什麼挑這麼個時間,完全記不住;

這很正常,畢竟這一點上,Go 很另類,也可以說很「奇葩」。甚至有人註冊了一個域名:http://fuckinggodateformat.com/,我也是醉了。。。

但是這真的不好?

02 為什麼這麼設計?

為什麼選擇這個時間?不少人有這樣的疑問。有人猜測是 Go 項目啟動的時間等。但仔細研究,發現 Go Team 還是用心良苦,目的是解決大家記憶問題。

比如常規的 ymd 格式,以 PHP 為例,一般這樣 Y-m-d H:i:s,輸出類似:2021-08-03 09:30:00,但如果我想輸出:21-8-4 9:30:00,你不查手冊,能寫出來嗎?你看看 PHP 文檔中關於 date 格式化的說明,頭有點大,竟然那麼多,雖然常用的形式,大部分人都記得,但遇到不怎麼常用的,就得查手冊了。

反觀 Go 語言,它直接使用一個具體的時間來當做格式化字符串,需要什麼格式,改這個時間格式即可。比如上面的例子,常規方式:2006-01-02  15:04:05,而 21-8-4 9:30:00 這種格式,只需要對應的改變值即可:06-1-2 3:04:05。而且,我查了下,PHP 沒法表示沒有前導零的分鐘數和秒數,而 Go 很容易實現。很顯然,Go 的方式是更合理、更易用的,對於各種變化,也能夠更自如的應對。

只不過,很多人對這個具體的時間覺得記不住。這一點,Go 官方也考慮到了。畢竟採用特殊的時間,目的就是為了解決大家記憶問題,因此要確保這個特殊時間也好記。Go 是這麼設計的:

1: month (January, Jan, 01, etc)
2: day
3: hour (15 is 3pm on a 24 hour clock)
4: minute
5: second
6: year (2006)
7: timezone (GMT-7 is MST)

剛好是 1 2 3 4 5 6 7,據此進行變化即可。

比如官方定義的常量:

const (
    ANSIC       = "Mon Jan _2 15:04:05 2006"
    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    RFC822      = "02 Jan 06 15:04 MST"
    RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"
)

按 ANSIC 標準的日期格式,月、日、時、分、秒、年,最後加 MST 時區。對應就是 1 2 3 4 5 6 7。同時還可以隨意加星期幾。

發現沒有?圍繞著 1 2 3 4 5 6 7 隨意變化,真的不要太爽。我相信你用習慣了會發現 Go 這個設計真的太好了。

03 總結

Go 的設計原則之一:大道至簡。儘量簡潔,讓大家開心編程。我認為這個格式化時間的設計也體現了這一點,他們設計的很用心。

知曉了為什麼這麼設計,我相信你看完這篇文章會從此愛上 Go 的時間格式化形式。

我是 polarisxu,北大碩士畢業,曾在 360 等知名網際網路公司工作,10多年技術研發與架構經驗!2012 年接觸 Go 語言並創建了 Go 語言中文網!著有《Go語言編程之旅》、開源圖書《Go語言標準庫》等。

堅持輸出技術(包括 Go、Rust 等技術)、職場心得和創業感悟!歡迎關注「polarisxu」一起成長!也歡迎加我微信好友交流:gopherstudio

轉發和在看,是更大的支持

相關焦點

  • Golang 時間操作大全
    Go 語言提供了時間類型格式化函數 Format(),需要注意的是 Go 語言格式化時間模板不是常見的 Y-m-d H:i:s,而是 2006-01-02 15:04:05,也很好記憶(2006 1 2 3 4 5)。
  • Go技術日報(2021-02-05)——Golang 中 nil==nil 是對是錯?
    go中文網每日資訊--2021-02-05 一、#公眾號:Go語言中文網二、#公眾號:亞軍進化史三、#公眾號:轉角遇到GitHub四、#公眾號:吳親強的深夜食堂/godailyGOCN每日新聞--2021-02-05 1.Go 泛型提案有望被接受,已進入"Likely Accept"狀態 [3]2.快速構建 Go GraphQL 應用[4]3.Golang 全球使用現狀 [5]
  • Go技術日報(2021-02-04)——Go channel 的妙用
    go 中文網每日資訊--2021-02-04 一、#公眾號:Go 語言中文網二、#公眾號:亞軍進化史三、#公眾號:polarisxu四、#公眾號:k8s 技術圈[4]5.Go 中的測試模式[5]來源:https://gocn.vip/topics/node18gopherDaily--2021-02-04 1.Go 語言的當前狀態(2021.2.3)[6]2.Go 泛型提案進入
  • go語言教程零基礎入門到精通
    開課介紹02.mp4│      03 Go開發1期 day1 開發環境搭建01.mp4│      04 Go開發1期 day1 開發環境搭建02.mp4│      05 Go開發1期 day1 高並發-channel演示01.mp4│      06 Go開發1期 day1 高並發-channel演示02.mp4│      07 Go開發1期 day1
  • Go技術日報(2021-02-22)——Go 工程化(三) 依賴注入框架 wire
    五、奇伢雲存儲六、網管叨 bi 叨七、mohuishouGo 工程化(三) 依賴注入框架 wire - Mohuishou[1]來源: https://studygolang.com/go/godailyGOCN 每日新聞--2021-02-22
  • Go技術日報(2021-02-01)——Go1.16 即將正式發布,以下變更你需要知道
    Perlisgo 中文網每日資訊--2021-02-01 一、#公眾號:Go 語言中文網二、#公眾號:亞軍進化史三、#公眾號:代碼與遠方四、#公眾號:新亮筆記go/godailyGOCN 每日新聞--2021-02-01 1.永遠不要在不知道如何停止的情況下啟動一個 goroutine [2]2.Go 看源碼必會知識之 unsafe 包3.分布式任務調度系統之任務編排及工作流實現原理與
  • Go技術日報(2021-01-30)——Go工程化(一) 架構整潔之道閱讀筆記
    Embed in Go 1.16 Version[3]來源: https://studygolang.com/go/godailyGOCN每日新聞--2021-01-30 1.Go JWT 實戰 [4]2.詳解 Go 中內存分配源碼實現[5]
  • Go技術日報(2021-02-15)——Rust 的第一印象
    官方最新的依賴管理指南 : https://golang.org/doc/modules/managing-dependencies[8]深入理解Go測試覆蓋率 : https://eleni.blog/2021/01/24/deep-diving-in-the-go-coverage-profile/[9]深入了解Go的基準測試: https://medium.com
  • Gerald Weinberg-探索需求2006-UMLChina講座-音頻
    北京時間2006年2月20日(周一)上午10:00-12:00溫伯格(Gerald Weinberg)(1933-2018)。
  • 歐神小密圈(2018.04.02):加大貸款
    2018/04/02 23:15匿名用戶 提問:歐神你好,看剛剛有人提問註冊公司,註冊了不用了,可以註銷嗎?會有影響嗎,謝謝可以費錢 2018/04/02 23:15匿名用戶 提問:歐大,除了炒房,再推薦幾個相對能抗通脹同級科技樹的行業?
  • Pandas 時間序列 - 縱覽與時間戳
    .: Out[58]: DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',               '2012-10-10 18:15:05', '2012-10-11 18:15:05',               '2012-10-12 18:15:05'],
  • Go技術日報(2021-02-24)——滴滴:如何提高代碼的可讀性,以 Go 為例!
    go 中文網每日資訊--2021-02-24 一、Go 語言中文網二、亞軍進化史三、Go 招聘四、雲加社區五、k8s1.TiDB 條分縷析 Raft 算法 [1]2.Go 高效截取字符串的一些思考3.什麼是大端序和小端序,為什麼要有字節序4.從 go-chi 框架撤回所有主版本聊 Go1.16 的新特性
  • 安全事件周報 (02.01-02.07)
    包括瀏覽器、郵件客戶端、vpn、遠程桌面等在內的個人應用程式,應及時更新到最新版本4. 各主機安裝EDR產品,及時檢測威脅5.由此,ENKI研究人員對本次所使用的ie0day進行了分析,分析詳情見連結。
  • 市場晨早快訊. 2021.02.04(星期四)
    市場晨早快訊2021年2月04日                      Rsf.SR2021-02-063
  • 3.Ps中的數字拼貼 構圖和視覺效果_13-15_2H58M15P-211219_Nick Pedersen
    .13.16_16.05.13 - Special Effects P13 - 00:00detail take a look at and get some ideas.13 - Special Effects P13 - 01:03make a new layer that's above the birds layer.
  • pandas中的時間序列
    data = pd.date_range(start='20200601', end='20200622')'''DatetimeIndex(['2020-06-01', '2020-06-02', '2020-06-03', '2020-06-04', '2020-06-05', '2020-06-06', '
  • 星座月份時間對照表
    星座名稱 黃道帶時間(一般認知) 恆星時間 太陽所在星座時間 對應的農曆節氣 白羊座 03月21日-04月19日 04月15日-05月15日 04月19日-05月13日 春分-穀雨前一天 金牛座 04月20日-05月20日 05月16日-06月15日 05月14日-06月19日 穀雨-小滿前一天 雙子座 05月21日-