我发现time.Now().UTC()
方法的输出中有些不一致。有时我得到这个:
"created": "2018-10-18T08:50:33.636433623Z"
有时我会得到:
"created": "2019-05-10T08:16:07.871395Z",
不同之处在于最后一部分的位数。为什么这不一致?有谁知道我如何调试/确保它确实是一致的?
答案 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上尝试示例。