Go の「time.Parse」関数が予期しない時間値を返すのはなぜですか?

Barbara Streisand
リリース: 2024-11-23 10:00:35
オリジナル
926 人が閲覧しました

Why is my Go `time.Parse` function returning an unexpected time value?

Go での time.Parse の動作を理解する

Go で time.Parse メソッドを使用して文字列を time.Time 値に変換しようとすると、期待どおりの結果を得るには、正しい形式文字列を設定することが重要です。

次のコードを検討してください。スニペット:

package main

import (
    "fmt"
    "time"
)

func main() {
    const longForm = "2013-05-13T18:41:34.848Z"
    //even this is not working
    //const longForm = "2013-05-13 18:41:34.848 -0700 PDT"
    t, _ := time.Parse(longForm, "2013-05-13 18:41:34.848 -0700 PDT")
    fmt.Println(t)
}
ログイン後にコピー

このコードは、longForm 形式の文字列を使用して、「2013-05-13 18:41:34.848 -0700 PDT」形式の文字列を解析しようとします。ただし、出力は予期しないものです: "0001-01-01 00:00:00 0000 UTC".

この動作を理解するには、time.Parse メソッドのデフォルトの参照時刻が " であることに注意することが重要です。 Mon Jan 2 15:04:05 MST 2006"、Unix 時間 1136239445 を表します。これは、フォーマット文字列は、それに応じて基準時間を表す必要があります。

指定されたコードでは、longForm フォーマット文字列が基準時間を誤って「2006-01-02 15:04:05 -0700」と表しています。この参照時間形式の不一致により、予期しない出力が発生します。

この問題を解決するには、参照時間と一致するようにlongForm形式文字列を変更する必要があります。

package main

import (
        "fmt"
        "log"
        "time"
)

func main() {
        const longForm = "2006-01-02 15:04:05 -0700"
        t, err := time.Parse(longForm, "2013-05-13 18:41:34.848 -0700")
        if err != nil {
                log.Fatal(err)
        }
        fmt.Println(t)
}
ログイン後にコピー

正しいlongFormを使用書式文字列、time.Parse メソッドは文字列を time.Time 値に正確に変換するようになりました: "2013-05-13 01:41:34.848 0000 UTC"。

以上がGo の「time.Parse」関数が予期しない時間値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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