我有类似下面的代码
package main
import (
"fmt"
"time"
"encoding/json"
)
type Message struct {
Time time.Time `json:"timestamp,omitempty"`
}
func main() {
t, _ := time.Parse("2006-01-02T15:04:05.999Z07:00", "2017-05-01T15:04:05.630Z")
msg := Message{
Time: t,
}
bs, _ := json.Marshal(msg)
fmt.Println(string(bs[:]))
}
这打印
{"timestamp":"2017-05-01T15:04:05.63Z"}
如何让 json 编码保持尾随 0?即,打印这个?
{"timestamp":"2017-05-01T15:04:05.630Z"}
编辑:
这里是 Playground https://play.golang.org/p/9p3kWeiwu2
最佳答案
time.Time 始终编码为 RFC 3339,仅包括亚秒级精度(如果存在):https://golang.org/pkg/time/#Time.MarshalJSON
您可以使用命名的 time.Time 类型编写您自己的自定义版本,或者您可以为您的结构定义一个自定义编码函数,或者您可以让您的结构在那个地方保存一个字符串。在任何情况下,如果您想使用相同的格式,但包括尾随零,则需要使用 RFC3339Nano 常量的修改版本。
它的值为:"2006-01-02T15:04:05.999999999Z07:00"
。
末尾的 9 表示“包括直到最右边的非零值,之后省略”。如果将这些 9 更改为 0,它将始终包含它们。例如,如果你总是想要毫秒精度(之后没有任何东西,不管它是否非零),你会使用:
“2006-01-02T15:04:05.000Z07:00”
如果您在 time.Time 值上将其提供给 Format(),您将得到所需的字符串,因此可以将其包含在 JSON 中。
关于go - 防止 json.Marshal time.Time 删除尾随零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741286/