Go で間違ってフォーマットされた日時文字列をアンマーシャリングする方法

Mary-Kate Olsen
リリース: 2024-11-04 18:17:01
オリジナル
332 人が閲覧しました

How to Unmarshal Incorrectly Formatted Datetime Strings in Go?

不正にフォーマットされた日時のアンマーシャル

背景

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート