2 回答

TA貢獻1839條經驗 獲得超15個贊
包車時間
導入“時間”
類型時間
A Time 表示具有納秒級精度的瞬間。
使用時間的程序通常應該將它們作為值而不是指針來存儲和傳遞。也就是說,時間變量和結構字段應該是 time.Time 類型,而不是 *time.Time。
我只是不斷修復可能的問題,例如,time.Time
不是*time.Time
,真實日期等等,直到我得到一個合理的結果:
package main
import (
? ? "encoding/json"
? ? "fmt"
? ? "strings"
? ? "time"
)
type MyTime struct {
? ? time.Time
}
func (m *MyTime) UnmarshalJSON(data []byte) error {
? ? // Ignore null, like in the main JSON package.
? ? if string(data) == "null" || string(data) == `""` {
? ? ? ? return nil
? ? }
? ? // Fractional seconds are handled implicitly by Parse.
? ? tt, err := time.Parse(`"`+time.RFC3339+`"`, string(data))
? ? *m = MyTime{tt}
? ? return err
}
type Added struct {
? ? Added MyTime `json:"added"`
}
func main() {
? ? st := strings.NewReader(`{"added": "2012-04-23T18:25:43.511Z"}`)
? ? var a Added
? ? err := json.NewDecoder(st).Decode(&a)
? ? if err != nil {
? ? ? ? panic(err)
? ? }
? ? fmt.Println(a)
}
游樂場:https://play.golang.org/p/Uusdp3DkXDU
輸出:
{2012-04-23?18:25:43.511?+0000?UTC}
對于空 (?""
) 日期字符串,time.Time
零值0001-01-01 00:00:00 +0000 UTC
:
游樂場:https://play.golang.org/p/eQoEyqBlhg2
輸出:
{0001-01-01?00:00:00?+0000?UTC}
使用該time
?IsZero
方法測試零值。
func(時間)IsZero
func?(t?Time)?IsZero()?boolIsZero 報告 t 是否代表零時刻,1 月 1 日,1 年,00:00:00 UTC。

TA貢獻1816條經驗 獲得超4個贊
我認為您已經非常接近您的自定義編組器的解決方案。也許只是恢復正常日期的正常解碼。這可能有助于:
type MyTime time.Time
func (m *MyTime) UnmarshalJSON(data []byte) error {
// Ignore null, like in the main JSON package.
if string(data) == "null" || string(data) == `""` {
return nil
}
return json.Unmarshal(data, (*time.Time)(m))
}
- 2 回答
- 0 關注
- 162 瀏覽
添加回答
舉報