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

标签 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"}

编辑:

这里是 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 中。

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

关于go - 防止 json.Marshal time.Time 删除尾随零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43741286/

相关文章:

postgresql - 如何向数据库中插入多个值

javascript - WebSocket 连接失败:连接建立时出错:net::ERR_SSL_PROTOCOL_ERROR

go - 使用 kafka-go 计划在 Kafka 中创建消费者

go - 如何通过 Gmail Go SDK 将 html 模板正文作为电子邮件发送?

json - 如何在 golang 中替换/更新 json 数组中的键值?

go - Cobra cli 无法初始化新工具

go - 如何隐藏终端命令的输出

go - 在 Go 中将 uint32 转换为 int

去构建失败: "Downloaded inconsistent tile" when running "go build" with go mod file

go - 如何在 Golang 中用 div 包裹每一行?