Go time.Time.UTC()有时给出7位数字,有时给出9位数字

时间:2019-05-10 08:23:39

标签: go time

我发现time.Now().UTC()方法的输出中有些不一致。有时我得到这个:

"created": "2018-10-18T08:50:33.636433623Z"

有时我会得到:

"created": "2019-05-10T08:16:07.871395Z",

不同之处在于最后一部分的位数。为什么这不一致?有谁知道我如何调试/确保它确实是一致的?

1 个答案:

答案 0 :(得分:8)

当您在秒的小数部分中看到较少的数字时,那是因为它将以零结尾,而将它们保留为零不会更改时间值。

看起来您是通过将一些值(包含时间戳)编组到JSON来生成这些输出的。 time.Time“控制” Time.MarshalJSON()的JSON表示形式:

  

时间是RFC 3339格式的带引号的字符串,如果存在,则添加亚秒精度。

请参见以下示例:

t1 := time.Date(2019, 5, 10, 11, 12, 13, 123456789, time.UTC)
fmt.Println(t1)

t2 := time.Date(2019, 5, 10, 11, 12, 13, 123456700, time.UTC)
fmt.Println(t2)

这将输出:

2019-05-10 11:12:13.123456789 +0000 UTC
2019-05-10 11:12:13.1234567 +0000 UTC

将它们封送为JSON:

data, err := json.Marshal(t1)
fmt.Println(string(data), err)
data, err = json.Marshal(t2)
fmt.Println(string(data), err)

给出输出:

"2019-05-10T11:12:13.123456789Z" <nil>
"2019-05-10T11:12:13.1234567Z" <nil>

如果希望零出现在输出中,请使用time.Format()并在格式字符串中为第二个分数使用尽可能多的零,以在输出中使用所需的位数。记录在time package: Constants

  

小数点后跟一个或多个零表示小数秒,打印到给定的小数位数。小数点后跟一个或多个9代表一个小数秒,打印到给定的小数位数,并删除了尾随零“

Time.MarshalJSON()使用time.RFC3339Nano,即:

RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"

因此删除尾随零。如果您使用以下格式的零而不是九:

fmt.Println(t2.Format("2006-01-02T15:04:05.000000000Z"))

这将输出:

2019-05-10T11:12:13.123456700Z

Go Playground上尝试示例。