[Go] 文字列を time.Time 構造体に変換するtime.Parse の使い方

意外と書いているサイトが少なくてハマったのでメモ。

Go の標準モジュールtime では、時刻を time.Time 構造体で扱う。

文字列を time.Time 構造体に変換するには、time.Parse を使う。

package main

import
	(
		"fmt"
		"time"
	)

func main() {
	date := "2023-06-02 06:00:00 JST"
	layout := "2006-01-02 03:04:05 MST"
	t, _ := time.Parse(layout, date)
	fmt.Println(t)
}

結果は、2023-06-02 06:00:00 +0900 JST となる。

time.Parse では、date を layout のフォーマットに従って time.Time に変換する。この時、layout では2006/01/02 03:04:05 MST を指定する必要がある。

自分はそこをよく知らずに適当な日付を入れてしまってうまく動かず、ハマった。よく考えればわかることだった……。

なぜこの時刻かというと、MSTは -7時間を意味するので、アメリカ的な時間表記で言うと 01/02 03:04:05 '06 -0700 というふうに、1から7まで順番に増えていく時刻だからである。

ここの時間に関してはAM3時(=3時)とPM3時(=15時)という情報がどちらもあるが、どちらを指定しても結果は変わらない。このあたりは自動で判別してくれるのだろうか。謎である。

省略すると 0が割り当てられるので、日付しか必要ない場合などは、

package main

import
	(
		"fmt"
		"time"
	)

func main() {
	date := "2023-06-02"
	layout := "2006-01-02"
	t, _ := time.Parse(layout, date)
	fmt.Println(t)
}

このようにしても良い。2023-06-02 00:00:00 +0000 UTCが返ってくる。

ちなみに、年を省略しても西暦0年になる。月や日を省略したら0ではなく1になる。