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

Rog*_*ers 0 time go

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

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

有时我得到这个:

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

区别在于最后一部分的位数。为什么这不一致?有谁知道我可以调试/确保它确实是一致的?

icz*_*cza 8

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

看起来您是通过将一些值(包含时间戳)编组到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上尝试示例。