emahiro/b.log

日々の勉強の記録とか育児の記録とか。

文字列化した時刻を time.Time に parse する

これは何?

https://pkg.go.dev/time#Time.String で Go の時刻を文字列化した値を再度 time.Time に変換する実装について記載してます。

どうやるか?

Time.String() で Go の時刻を文字列として出力した値を time.Time に戻す場合はフォーマットを文字列化された時刻に合わせて調整します。
例えば単純に以下のコードを実行します。

func main() {
    t1 := time.Now().UTC()
    tstr := t1.String()
    fmt.Println(tstr)

    t2, err := time.Parse("2006-01-02 15:04:05", tstr)
    if err != nil {
        panic(err)
    }

    fmt.Println(t2)
}

Output

2009-11-10 23:00:00 +0000 UTC
panic: parsing time "2009-11-10 23:00:00 +0000 UTC": extra text: " +0000 UTC"

goroutine 1 [running]:
main.main()
    /tmp/sandbox1254715714/prog.go:17 +0x1ac

Program exited.

ref: https://go.dev/play/p/1d_2RhWC05l

+0000 UTC が format に含まれていないのでこれをつけて parse します。

func main() {
    t1 := time.Now().UTC()
    tstr := t1.String()
    fmt.Println(tstr)

    t2, err := time.Parse("2006-01-02 15:04:05 +0000 UTC", tstr)
    if err != nil {
        panic(err)
    }

    fmt.Println(t2)
}

ref: https://go.dev/play/p/B6_Bwj8PomV

UTC じゃない場合は timezone 設定も入ってきたります。

まとめ

プロダクションコードで時刻を文字列化してやりとりしていたのですが、ややこしいのでやり取りする時は Unix Timestamp あたりに統一しておけばよかったなと後悔しました。