⏰
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