2017-05-02 102 views
0

我有类似以下防止json.Marshal了time.time移除结尾零

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

+0

要有所控制,你可能会需要定义基于'time.Time'自己的类型,并实现自己的MarshalJSON'的'版本的该类型的那个级别。 –

+0

这是为什么这是必要的?据推测,接收机需要3个精确的小数点?你可以勉强一点,只要确保你在那个地方从来没有零点加入'0.001秒'?这会影响准确性(无论重要程度取决于您的应用程序),但可能会使代码的其余部分更加容易。 – Flimzy

+0

好吧,增加0.001秒仍然不能确保你永远不会有.000,因为它会导致X.999卷起到(X + 1).000。 – Kaedys

回答

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值,你会得到你想要的字符串,并且可以将它包含在JSON中。

运作例如:https://play.golang.org/p/oqwnma6odw