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

时间:2017-05-02 15:04:22

标签: 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[:]))
}

打印

{"timestamp":"2017-05-01T15:04:05.63Z"}

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

{"timestamp":"2017-05-01T15:04:05.630Z"}

编辑:

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

1 个答案:

答案 0 :(得分:2)

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