これは何?
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 あたりに統一しておけばよかったなと後悔しました。