🕛
【Go】Unix時刻が0なtime.TimeはZeroValueでない
要点
- Timeのゼロ値は西暦の開始時刻(
0001-01-01 00:00:00 +0000 UTC
) - Unix時刻基準で、0は
1970-01-01 00:00:00 +0000 UTC
- Unix時刻が0でもTimeのIsZeroはfalse(ゼロ値ではない)になる
コードサンプル
Go 1.21で書いてます。
コード
package main
import (
"fmt"
"time"
)
func main() {
t0 := time.Unix(0, 0) // UnixTime 0
fmt.Printf("time t0 (unixtime 0): %v\n", t0)
fmt.Printf("t0 is Zero Value: %v\n", t0.IsZero())
t1 := time.Time{} // Zero Value
fmt.Printf("time t1 (zero value): %v\n", t1)
fmt.Printf("t1 is Zero Value: %v\n", t1.IsZero())
}
実行結果
time t0 (unixtime 0): 1970-01-01 00:00:00 +0000 UTC
t0 is Zero Value: false
time t1 (zero value): 0001-01-01 00:00:00 +0000 UTC
t1 is Zero Value: true
Program exited.
なぜこの記事を書いたのか
GoとPostgresでデータ管理APIを開発してた時に、UnixTimeが0(未指定時)とTimeのゼロ値は対応させたかったけど、何も考えずにTime.Unixにぶち込んだらゼロ値じゃなくてバグったため。
Discussion