为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
炎炎设计 2023-06-19 13:49:55
我发现该方法的输出有些不一致time.Now().UTC()。有时我得到这个:"created": "2018-10-18T08:50:33.636433623Z"有时我得到这个:"created": "2019-05-10T08:16:07.871395Z",不同之处在于最后一部分的位数。为什么这不一致?有谁知道我如何调试/确保它确实一致?
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

当您在秒的小数部分看到较少的数字时,那是因为它将以零结尾,将它们排除在外并不会改变时间值。

看起来您是通过将一些值(包含时间戳)编组到 JSON 来生成这些输出的。a 的 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)

这输出:


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>

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>

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包中:常量:

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


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上的示例。

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


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上的示例。

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


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上的示例。



查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信