如何記住Go time.Format“風騷”的使用方法?

zhjx922 發表於 2022-06-15
Go

其它程式語言的開發者,在第一次使用Go的時間格式化方法時一定會一臉懵逼,為什麼不是我熟悉的yyyy、MM、dd,而是一個特殊的年、月、日數字呢?

首先看一下正確的使用方法

// 程式碼
s := time.Now().Format("2006-01-02 15:04:05.999999")
fmt.Printf("%s\n", s)

// 結果(正確)
2022-06-14 23:21:48.655781

如果後面的時間隨便輸入呢?(其實我是複製上面的輸出結果)

// 程式碼
s := time.Now().Format("2022-06-14 23:21:48.655781")
fmt.Printf("%s\n", s)

// 結果(出乎意料)
141414-22-627 1411:146:278.61818786

既然必須得按人家的規範來,那我們如何方便快速得記住這段神奇的數字呢?
官方的文件和原始碼中有這麼一記錄:

// These are predefined layouts for use in Time.Format and time.Parse.
// The reference time used in these layouts is the specific time stamp:
//    01/02 03:04:05PM '06 -0700

其實就是1月2日3點(下午)4分5秒6年-7時區(崔健:一二三四五六七呀……
我們日常習慣都是年月日,給記憶帶來了一丟丟麻煩,不管時區的話就是:612345。
記住了嗎?寫幾個試試唄?

// 程式碼
s := time.Now().Format("2006年01月02日 15時04分05秒999毫秒")
fmt.Printf("%s\n", s)

// 輸出(發現了嗎?除了毫秒都正確!)
2022年06月14日 23時46分45秒999毫秒

// 經過測試,發現毫秒前面必須有:,或者.,使用9或者0都可以
time.Now().Format("2006年01月02日 15時04分05秒.000毫秒")


// 程式碼(整個奇怪的形狀,月日時秒不補0)
s := time.Now().Format("2006/1/2 3:04:5")
fmt.Printf("%s\n", s)

// 輸出
2022/6/14 11:53:2

各種細節還是得看文件:

//    Year: "2006" "06"
//    Month: "Jan" "January"
//    Textual day of the week: "Mon" "Monday"
//    Numeric day of the month: "2" "_2" "02"
//    Numeric day of the year: "__2" "002"
//    Hour: "15" "3" "03" (PM or AM)
//    Minute: "4" "04"
//    Second: "5" "05"
//    AM/PM mark: "PM"

看了這麼多,你學廢了嗎?如果還不會用,那就自己封裝一個yyyyMMdd自己習慣的方式吧,Go純粹就是把2006、01、02這些數字當成了yyyMMdd這種方式用了……