Go 中如何解析日期字符串
Suraj Joshi
2023年1月30日
2020年6月9日
日期解析是编程中遇到的最常见的任务之一。Go 使用标准日期,这与其他使用代码表示日期/时间字符串表示形式的部分的编程语言不同。Go 中的解析是在 time 包中的 Parse 和 Format 函数的帮助下完成的。
Go 中日期和时间的表示
为了解析 Go 中的日期,我们使用了一种称为布局 layout
的方法。Go 中有一个标准时间,在 Go 中解析日期时我们需要记住:
Mon Jan 2 15:04:05 MST 2006
是 2006 年 1 月 2 日下午 3:04:05 UTC-0700。
在 Go 中解析日期字符串
为了解析日期字符串,我们将此布局传递给 time.Parse
函数。我们使用实时格式,而没有在 parse
函数中使用字母指定日期,这使 parse
函数非常有趣。
time.Parse
函数采用由时间格式占位符作为第一个参数和代表时间的实际格式化字符串作为第二个参数的布局。
package main
import (
"fmt"
"time"
)
func main() {
timeT, _ := time.Parse("2006-01-02", "2020-04-14")
fmt.Println(timeT)
timeT, _ = time.Parse("06-01-02", "20-04-14")
fmt.Println(timeT)
timeT, _ = time.Parse("2006-Jan-02", "2020-Apr-14")
fmt.Println(timeT)
timeT, _ = time.Parse("2006-Jan-02 Monday 03:04:05", "2020-Apr-14 Tuesday 23:19:25")
fmt.Println(timeT)
timeT, _ = time.Parse("2006-Jan-02 Monday 03:04:05 PM MST -07:00", "2020-Apr-14 Tuesday 11:19:25 PM IST +05:30")
fmt.Println(timeT)
}
输出:
2020-04-14 00:00:00 +0000 UTC
2020-04-14 00:00:00 +0000 UTC
2020-04-14 00:00:00 +0000 UTC
0001-01-01 00:00:00 +0000 UTC
2020-04-14 23:19:25 +0530 IST
Go 在其 package
中具有一些预定义的时间布局常量。
常量 | Layout |
---|---|
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" |
Stamp |
"3:04PM" |
StampMilli |
"Jan _2 15:04:05.000" |
StampMicro |
"Jan _2 15:04:05.000000" |
StampNano |
"Jan _2 15:04:05.000000000" |
我们可以使用上述预定义的常量而不是布局字符串来解析日期时间。
package main
import (
"fmt"
"time"
)
func main() {
timeT, _ := time.Parse(time.RFC3339, "2020-04-15T13:45:26Z")
fmt.Println(timeT)
}
输出:
2020-04-15 13:45:26 +0000 UTC
如果我们使用的是 time.Time
类型,则可以使用格式函数将其转换为字符串。
package main
import (
"fmt"
"time"
)
func main() {
input := "2020-04-14"
layout := "2006-01-02"
t, _ := time.Parse(layout, input)
fmt.Println(t)
fmt.Println(t.Format("02-Jan-2006"))
}
输出:
2020-04-14 00:00:00 +0000 UTC
14-Apr-2020
Author: Suraj Joshi
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn