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