防止 json.Marshal time.Time 删除尾随零

sta*_*wer 3 go

我有类似于以下的代码

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[:]))
}
Run Code Online (Sandbox Code Playgroud)

这打印

{"timestamp":"2017-05-01T15:04:05.63Z"}
Run Code Online (Sandbox Code Playgroud)

如何让 json 编组保留尾随 0?即,打印这个?

{"timestamp":"2017-05-01T15:04:05.630Z"}
Run Code Online (Sandbox Code Playgroud)

编辑:

这是游乐场https://play.golang.org/p/9p3kWeiwu2

Kae*_*dys 6

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 中。

功能示例: https: //play.golang.org/p/oqwnma6odw