ホームページ  >  記事  >  バックエンド開発  >  Go で間違ったタイムゾーン オフセットを持つ JSON をアンマーシャリングする方法は?

Go で間違ったタイムゾーン オフセットを持つ JSON をアンマーシャリングする方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-05 08:25:02908ブラウズ

How to Unmarshal JSON with Incorrect Timezone Offset in Go?

JSON アンマーシャリングの無効な日時形式

バックグラウンド

Go の JSON アンマーシャリングには、タイムゾーン オフセットが含まれる ISO8601/RFC3339 に従ってフォーマットされた日時に関する問題があります。 02:00 ではなく 0200 をフォーマットしてください。

問題

間違った 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 形式からアンマーシャリングできます。

Notes

  • デフォルトでは、RFC3339Nano 形式が適しています。 Parse ではタイムゾーン オフセットに "Z" が使用されますが、修正された形式では "Z0700" が使用されます。
  • 時間形式の "2006" は Go のリリースの最初の年を指します。

以上がGo で間違ったタイムゾーン オフセットを持つ JSON をアンマーシャリングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。