Goでtime.Timeを比較: タイムゾーンが違っても絶対時間が同じなら等しい

に公開

はじめに

time.Time 型には「場所情報(Location)」も含まれています。たとえばUTCで設定した時刻とJSTで設定した時刻が同じ絶対時間ならば、 Equal や比較演算子 ( Before, After) は「絶対時間」基準で評価します。ロケーションが異なるかどうかは影響しません。

package main

import (
	"fmt"
	"time"
)

func main() {
	// 2023-10-01 12:00:00 UTC
	t1 := time.Date(2023, 10, 1, 12, 0, 0, 0, time.UTC)
	// 2023-10-01 21:00:00 JST (UTC+9)
	locJST, _ := time.LoadLocation("Asia/Tokyo")
	t2 := time.Date(2023, 10, 1, 21, 0, 0, 0, locJST)

	fmt.Println("t1:", t1)
	fmt.Println("t2:", t2)
	fmt.Println("Are they equal?", t1.Equal(t2))
}
% go run ./main.go
t1: 2023-10-01 12:00:00 +0000 UTC
t2: 2023-10-01 21:00:00 +0900 JST
Are they equal? true

上のコードでは t1 はUTC、t2 はJSTという異なるロケーションを持ちますが、実際には同じ絶対時刻なので Equaltrue を返します。

まとめ

time.Time の比較は「絶対時刻」を基準とします。UTCとJSTで表示が違っても、本質的に同じ瞬間なら t1.Equal(t2)true になります。もしロケーション自体を含めて比較したい場合は、 Location() メソッドなどで別途チェックが必要です。短い調査なら、上の例を動かして確認する方法がシンプルで分かりやすいです。

Discussion