Go 日期时间解析
最后修改时间 2024 年 4 月 11 日
在本文中,我们将展示如何在 Golang 中使用 time.Parse 和 time.ParseInLocation 解析日期时间值。
func Parse(layout, value string) (Time, error)
parse 函数解析一个格式化的字符串并返回它所表示的时间值。
func ParseInLocation(layout, value string, loc *Location) (Time, error)
ParseInLocation 函数解析一个格式化的字符串并返回它所表示的时间值,同时考虑了时区(location)。
与大多数其他语言不同,Go 不使用 yyyy-mm-dd 等格式说明符来解析日期时间值。相反,它使用一个独特的日期时间值 Mon Jan 2 15:04:05 MST 2006。因此,为了解析日期时间值,我们选择该确切时刻的一个特定布局。
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 time.Parse 示例
在第一个示例中,我们使用 time.Parse 函数来解析几个日期时间值。
main.go
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 模块中有几个预定义的日期时间布局。
main.go
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
Go time.ParseInLocation 示例
time.ParseInLocation 函数在解析日期时间值时还会考虑时区。
main.go
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)
}
该示例在本地和 Europe/Moscow 时区解析给定的日期。
$ go run main.go 2022-05-28 11:54:40 +0200 CEST 2022-05-28 11:54:40 +0300 MSK
来源
在本文中,我们展示了如何解析日期时间值。