不正にフォーマットされた日時のアンマーシャル
背景
Go で日時文字列を解析しようとしたときtime.Parse を使用すると、タイムゾーン オフセットの形式が正しくないと失敗する可能性があります。具体的には、RFC3339 で要求されているように、オフセットが「02:00」ではなく「0200」と指定されている場合です。
質問
次の内容を含む一連の JSON ファイルがあるとします。 datetime のオフセット形式が正しくありません。JSON にマーシャリングされた datetime の形式を変更せずに、Go で正しくアンマーシャリングするにはどうすればよいですか?
回答
カスタム時間フィールド
有効なオフセット形式と無効なオフセット形式の両方を処理するために、独自のカスタム時間フィールド タイプを定義できます。これにより、デフォルトのアンマーシャル動作をオーバーライドし、2 つの予期される形式のいずれかに従って日時文字列を手動で解析できます。
実装例
<code class="go">type MyTime struct { time.Time } func (self *MyTime) UnmarshalJSON(b []byte) (err error) { s := string(b) // Remove quotes from JSON string (optional) 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 } type Test struct { Time MyTime `json:"time"` }</code>
この例ではでは、UnmarshalJSON メソッドを使用して、デフォルトのアンマーシャリング動作をオーバーライドします。まず日時文字列を囲んでいる引用符をすべて削除し、次に標準の time.RFC3339Nano 形式を使用して解析を試みます。それが失敗した場合は、間違った形式 (「2006-01-02T15:04:05.999999999Z0700」) も解析しようとします。
JSON メタデータの RFC3339Nano 形式
JSON のカスタム時間フィールドに RFC3339Nano 形式の使用を指定するには、UnmarshalJSON メソッドと同じ形式文字列を使用するだけです:
<code class="go">type Test struct { Time MyTime `json:"time,omitempty"` }</code>
これは、時間フィールドが次の形式で表現されることを示します。 RFC3339Nano 形式の文字列としての JSON。 JSON にマーシャリングして戻す場合、MyTime 型のオーバーライドされた MarshalJSON メソッドを使用して、正しい形式が維持されるようにします。
以上がGo で間違ってフォーマットされた日時文字列をアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。