🕛

【Go】Unix時刻が0なtime.TimeはZeroValueでない

2023/09/05に公開

要点

  • 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で書いてます。

https://go.dev/play/p/aUt1v2jNv9S

コード

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