Go 的时间格式

在 Go 中如果你需要解析一个自定义的时间字符串,将其转化为 Go 的 time.Time 类型,或者格式化的输出时间,那么你需要定义一个 layout。

在这一步就会容易出现错误,不同于其他语言以形如 yyyy-MM-dd HH:mm:ss 的格式解析,Go 是以一个特定的时间来确定格式, 即 **2006-01-02T15:04:05Z07:00**。

因此,如果你需要使用 Go 来解析一个时间字符串, 那么你可能就需要写如下的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
"time"
)

func main() {
t := time.Now()
fmt.Println(t.Format("2006-01-02 15:04:05"))
t, err := time.Parse("2006-01-02 15:04:05", "2019-01-01 12:00:00")
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(t.Format("2006-01-02 15:04:05"))
}
// output:
// 2021-12-14 16:46:19
// 2019-01-01 12:00:00

在 Go 中,时间的格式都是 20060102150405 的格式变种。

那么看到这里,肯定会觉得奇怪,为什么 Go 会选用这样的一个时间来作为格式化的标准。

实际上,这个时间中的0 1 2 3 4 5 6对应了 Posix 下 date 命令的输出

1
2
Mon Jan 2 15:04:05 -0700 MST 2006
0 1 2 3 4 5 6

7 对应的就是中间的时区。

因此想要转化时间不出错,需要记住这个时间点,也就是星期,月,日,时,分,秒,年的,从 0 递增的一个序列。


Go 的时间格式
https://blog.zhangliangliang.cc/post/time-format-of-go.html
作者
Bobby Zhang
发布于
2021年12月14日
许可协议