怎么做
簡而言之
time.Now().Format("2006-01-02 15:04:05")
你將會獲得如同 yyyy-MM-dd hh-mm-ss
這樣的輸出。
還可以
在 format.go 的源碼中我們可以找到一些預定的格式,源碼摘抄如下:
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"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)
我們可以直接使用 time.Time
對象的 format
函數,將以上預定的格式當作參數,來得到格式化后的時間字符串。
除了預定義的格式,我們也可以按照上述格式的規則自定義格式化字符串,就如同上一節 “簡而言之” 中描述的那樣。
為什么
golang的時間格式化並不像C#那樣使用 yyyy
表示年份、MM
表示月份等等。
而是使用 2006-01-02 15:04:05
這樣具有固定數字的格式化字符串。
你要問我為什么使用這樣看起來奇怪的格式化字符串?抱歉,我真的猜不透。
下面的代碼摘自golang源代碼 關於時間格式化的部分
// String returns the time formatted using the format string
// "2006-01-02 15:04:05.999999999 -0700 MST"
func (t Time) String() string {
return t.Format("2006-01-02 15:04:05.999999999 -0700 MST")
}
可以看到,golang中並沒有使用英文單詞首字母表示的格式化字符串,而是使用了一組固定的數據。
在 format.go 中第140行左右的地方,可以找到下面這個函數。
此函數用來判斷格式化字符串中的格式化內容。在其源代碼中,我們可以清晰地看到, golang 使用了硬編碼來對格式化字符串進行判斷。
// nextStdChunk finds the first occurrence of a std string in
// layout and returns the text before, the std string, and the text after.
func nextStdChunk(layout string) (prefix string, std int, suffix string) {
...
case '2': // 2006, 2
if len(layout) >= i+4 && layout[i:i+4] == "2006" {
return layout[0:i], stdLongYear, layout[i+4:]
}
return layout[0:i], stdDay, layout[i+1:]
case '_': // _2, _2006
if len(layout) >= i+2 && layout[i+1] == '2' {
//_2006 is really a literal _, followed by stdLongYear
if len(layout) >= i+5 && layout[i+1:i+5] == "2006" {
return layout[0 : i+1], stdLongYear, layout[i+5:]
}
return layout[0:i], stdUnderDay, layout[i+2:]
}
...
}
(由於該函數行數比較多,所以只摘抄部分,如果有興趣研究,請移步 format.go 源代碼 )
最后
我暫時不知道 golang 為何使用這樣的格式化字符串,但是既然這樣設計了,我們就應該如此使用。