首頁 >後端開發 >Golang >如何在 Go 中解組具有不正確時區偏移的 JSON?

如何在 Go 中解組具有不正確時區偏移的 JSON?

Susan Sarandon
Susan Sarandon原創
2024-11-05 08:25:021015瀏覽

How to Unmarshal JSON with Incorrect Timezone Offset in Go?

JSON 解組中的無效日期時間格式

背景

Go 的JSON 解組有依據ISO8601/RFC3339 格式化的日期時間問題,這些日期時間在格式0200 而不是02:00。

問題

JSON 格式不正確:

2016-08-08T21:35:14.052975+0200

預期正確格式:

2016-08-08T21:35:14.052975+02:00

可能的原因:

JSON 是使用C 的strftime 函數產生的,其格式字串不包含時區偏移中的冒號。

解決方案

要解決此問題並啟用兩種格式的正確解組,可以定義自訂時間欄位類型:

<code class="go">type MyTime struct {
    time.Time
}

func (self *MyTime) UnmarshalJSON(b []byte) (err error) {
    s := string(b)

    // Remove double quotes from JSON value
    s = s[1:len(s)-1]

    t, err := time.Parse(time.RFC3339Nano, s)
    if err != nil {
        t, err = time.Parse("2006-01-02T15:04:05.999999999Z0700", s)
    }
    self.Time = t
    return
}</code>

在此自訂類型中,UnmarshalJSON 方法嘗試根據RFC3339Nano(時區偏移中帶有冒號)和不帶冒號的RFC3339Nano 修改版本來解析字串。

用法

要使用自訂時間欄位類型:

<code class="go">type Test struct {
    Time MyTime `json:"time"`
}</code>

然後可以使用不正確或正確的時區偏移量從 JSON 格式解組該結構。

註解

  • 預設情況下,時間為 RFC3339Nano 格式。 Parse 使用「Z」作為時區偏移量,而在修改後的格式中,使用「Z0700」。
  • 時間格式中的年份「2006」是指 Go 發布的第一年。

以上是如何在 Go 中解組具有不正確時區偏移的 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn