我在time.Now().UTC()方法的输出中看到一些不一致之处。有时我得到这个:
"created": "2018-10-18T08:50:33.636433623Z"
有时我得到这个:
"created": "2019-05-10T08:16:07.871395Z",
区别在于最后一部分的位数。为什么这不一致?有谁知道我可以调试/确保它确实是一致的?
当您在秒的小数部分中看到较少的数字时,这是因为它将以零结尾,并且将它们保留为零不会更改时间值。
看起来您是通过将一些值(包含时间戳)编组到JSON来生成这些输出的。的JSON表示形式time.Time是“管理的”,Time.MarshalJSON()它是:
时间是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)
Run Code Online (Sandbox Code Playgroud)
输出:
2019-05-10 11:12:13.123456789 +0000 UTC
2019-05-10 11:12:13.1234567 +0000 UTC
Run Code Online (Sandbox Code Playgroud)
将它们编组为JSON:
data, err := json.Marshal(t1)
fmt.Println(string(data), err)
data, err = json.Marshal(t2)
fmt.Println(string(data), err)
Run Code Online (Sandbox Code Playgroud)
给出输出:
"2019-05-10T11:12:13.123456789Z" <nil>
"2019-05-10T11:12:13.1234567Z" <nil>
Run Code Online (Sandbox Code Playgroud)
如果希望零出现在输出中,请time.Format()在第二个分数的格式字符串中使用并使用尽可能多的零,以在输出中使用所需的位数。记录在time软件包中:Constants:
小数点后跟一个或多个零表示小数秒,打印到给定的小数位数。小数点后跟一个或多个9代表小数秒,打印到给定的小数位数,并删除了尾随的零。
Time.MarshalJSON()用途time.RFC3339Nano是:
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Run Code Online (Sandbox Code Playgroud)
因此尾随零将被删除。如果以以下格式使用零而不是九:
fmt.Println(t2.Format("2006-01-02T15:04:05.000000000Z"))
Run Code Online (Sandbox Code Playgroud)
输出:
2019-05-10T11:12:13.123456700Z
Run Code Online (Sandbox Code Playgroud)
在Go Playground上尝试示例。