在本文中,我们展示了如何使用time.Parse
和time.ParseInLocation
在Golang中解析日期时间值。
func Parse(layout, value string) (Time, error)
parse
函数解析格式化的字符串并返回它表示的时间值。
func ParseInLocation(layout, value string, loc *Location) (Time, error)
ParseInLocation
函数解析格式化字符串并返回它表示的时间值,同时考虑位置(时区)。
与大多数其他语言不同,Go不使用格式说明符(例如yyyy-mm-dd
)解析日期时间值的常用方法。相反,它使用MonJan215:04:05MST2006
的唯一日期时间值。因此,为了解析日期时间值,我们选择了这一时刻的特定布局。
const ( Layout = "01/02 03:04:05PM '06 -0700" 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" 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" 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
模块中有几个预定义的布局可用。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
Gotime.Parse示例
在第一个示例中,我们使用time.Parse
函数来解析一些日期时间值。
package main import ( "fmt" "time" ) // Mon Jan 2 15:04:05 MST 2006 func main() { v1 := "2022/05/12" v2 := "14:55:23" v3 := "2014-11-12T11:45:26.37" const ( layout1 = "2006/01/02" layout2 = "15:04:05" layout3 = "2006-01-02T15:04:05" ) t, err := time.Parse(layout1, v1) if err != nil { fmt.Println(err) } fmt.Println(t.Format(time.UnixDate)) t, err = time.Parse(layout2, v2) if err != nil { fmt.Println(err) } fmt.Println(t.Format(time.Kitchen)) t, err = time.Parse(layout3, v3) if err != nil { fmt.Println(err) } fmt.Println(t.Format(time.UnixDate)) }
我们解析三个日期时间值。
v1 := "2022/05/12" v2 := "14:55:23" v3 := "2014-11-12T11:45:26.37"
我们有三个以不同格式编写的日期时间字符串。
const ( layout1 = "2006/01/02" layout2 = "15:04:05" layout3 = "2006-01-02T15:04:05" )
为了读取日期字符串,我们需要准备适当的布局。
t, err := time.Parse(layout1, v1) if err != nil { fmt.Println(err) } fmt.Println(t.Format(time.UnixDate))
我们使用time.Parse
读取第一个值并检查错误值。然后我们打印值并使用Format
函数将其格式化为time.UnixDate
。
$ go run main.go Thu May 12 00:00:00 UTC 2022 2:55PM Wed Nov 12 11:45:26 UTC 2014
预定义的日期时间布局
time
模块中有几个预定义的日期时间布局。
package main import ( "fmt" "time" ) func main() { dates := []string{ "Sat May 28 11:54:40 CEST 2022", "Sat May 28 11:54:40 2022", "Sat, 28 May 2022 11:54:40 CEST", "28 May 22 11:54 CEST", "2022-05-28T11:54:40.809289619+02:00", "Sat May 28 11:54:40 +0200 2022", } layouts := []string{ time.UnixDate, time.ANSIC, time.RFC1123, time.RFC822, time.RFC3339Nano, time.RubyDate, } for i := 0; i < len(dates); i++ { parsed, err := time.Parse(layouts[i], dates[i]) if err != nil { fmt.Println(err) } fmt.Println(parsed) } }
在示例中,我们有一个包含六个日期时间字符串的片段。我们使用适当的预定义日期时间常量来解析它们。
$ go run main.go 2022-05-28 11:54:40 +0200 CEST 2022-05-28 11:54:40 +0000 UTC 2022-05-28 11:54:40 +0200 CEST 2022-05-28 11:54:00 +0200 CEST 2022-05-28 11:54:40.809289619 +0200 CEST 2022-05-28 11:54:40 +0200 CEST
Gotime.ParseInLocation示例
time.ParseInLocation
函数在解析日期时间值时也会考虑时区。
package main import ( "fmt" "log" "time" ) func main() { loc, err := time.LoadLocation("Local") if err != nil { log.Println(err) } date := "Sat May 28 11:54:40 2022" parsed, err := time.ParseInLocation(time.ANSIC, date, loc) if err != nil { log.Println(err) } fmt.Println(parsed) loc, err = time.LoadLocation("Europe/Moscow") if err != nil { log.Println(err) } parsed, err = time.ParseInLocation(time.ANSIC, date, loc) if err != nil { log.Println(err) } fmt.Println(parsed) }
该示例解析本地和欧洲/莫斯科位置的给定日期。
$ go run main.go 2022-05-28 11:54:40 +0200 CEST 2022-05-28 11:54:40 +0300 MSK
在本教程中,我们展示了如何解析日期时间值。
列出所有Go教程。