2017-05-02 61 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