如何将当前时间格式化为 YYYY-MM-DDTHH:MM:SSZ

How to format current time into YYYY-MM-DDTHH:MM:SSZ

之前从未尝试过 Go,目前正在做一个小项目。其中一项任务是获取当前系统时间并以 YYYY-MM-DDT00:00:00Z 格式表示。我相信 Z 意味着时间以 UTC 格式表示,但是当我查看数据库时,所有时间戳都是这样的,即 2011-11-22T15:22:10Z

那么我如何在 Go 中像这样格式化?

更新 我能够使用以下代码对其进行格式化

t := time.Now()
fmt.Println(t.Format("2006-01-02T15:04:05Z"))

现在的问题是,Z在这里表示什么。我应该得到 UTC 时间吗?

另一个问题,我用来格式化的值似乎影响了输出,即当我使用 2019-01-02T15:04:05Z 时,输出变成了 2029-02-02T20:45:11Z,为什么?

Go 提供了非常灵活的时间解析方式。为此,您必须以您选择的格式编写“参考”时间。参考时间为Mon Jan 2 15:04:05 MST 2006。就我而言,我使用此参考时间来解析 Now():

fmt.Println(time.Now().UTC().Format(time.RFC3339))

如果你想看,还有其他引用类型:

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"

或者您可以使用您想要的参考。

"If a time is in Coordinated Universal Time (UTC), a "Z" 直接添加在时间之后,没有分隔 space。"Z" 是零 UTC 偏移量的区域指示符。因此,"09:30 UTC"表示为“09:30Z”或“0930Z”。同样,“14:45:15 UTC”写为“14:45:15Z”或“144515Z”。[16]

来自https://en.wikipedia.org/wiki/Time_zone#UTC

// Some valid layouts are invalid time values for time.Parse, due to formats
// such as _ for space padding and Z for zone information.

// Replacing the sign in the format with a Z triggers
// the ISO 8601 behavior of printing Z instead of an
// offset for the UTC zone. Thus:
//  Z0700  Z or ±hhmm
//  Z07:00 Z or ±hh:mm
//  Z07    Z or ±hh

来自软件包 time/format.go

的来源