あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

Go で少し混乱したこと

Go言語で時間を扱う time.Time のゼロ値で、勘違いしていたこと。

1970-01-01 09:00:00 はUnixタイムが0なのでゼロ値だと思っていましたが 違いました。
location "Asia/Tokyo" の time.Time のゼロ値は

local, _ := time.LoadLocation("Asia/Tokyo")
ztim := time.Time{}.In(local)
fmt.Printf("%v %v %v\n", ztim, ztim.Unix(), ztim.IsZero())
0001-01-01 09:18:59 +0918 LMT -62135596800 true

でした。

local, _ := time.LoadLocation("Asia/Tokyo")
tim := time.Unix(0, 0).In(local)
fmt.Printf("%v %v %v %v\n", tim, tim.Unix(), tim.IsZero())
1970-01-01 09:00:00 +0900 JST 0 false

なお、time.LoadLocation("Asia/Tokyo")は
1888-01-01 00:00 より前の時間だと、Location は Tokyo の LMT(Local Mean Time)
になるので、ゼロ値は LMTになります。

ゼロ値も JST (日本標準時)にしたい場合は、Locationをtime.FixedZone("JST", 9*60*60)にすればできます。

jst := time.FixedZone("JST", 9*60*60)
jtim := time.Time{}.In(jst)
fmt.Printf("%v %v %v %v\n", jtim, jtim.Unix(), jtim.IsZero())
0001-01-01 09:00:00 +0900 JST -62135596800 true

1888-01-01 00:00以降の時間はtime.LoadLocation("Asia/Tokyo")の Location は JST です。

local, _ := time.LoadLocation("Asia/Tokyo")
ztim := time.Date(1888, 1, 1, 0, 0, 0, 0, local)
fmt.Printf("%v\n", ztim,)
1888-01-01 00:00:00 +0900 JST

JST日本標準時)は1888年1月1日から使用されるようになりました。
それより前は東京の地方平時(LTM)が使われています。