事前知識
UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。協定世界時 (UTC) での1970年1月1日午前0時0分0秒(UNIXエポック)から形式的な経過秒数として表される。(wiki引用)
Unix時刻とは実際にどういったものなのか、例を出します
2024年1月1日9:00(JST) と
2024年1月1日0:00(UTC) はUnix時間で表すと
「1704067200」
になります。
Unix時間
上記で解説しましたが、
2024年1月1日9:00(JST) と2024年1月1日0:00(UTC) は
「1704067200」という整数です。
つまり2024年1月1日9:00(JST) と2024年1月1日0:00(UTC)の、
実体は全く同じとなります。
UNIX時間は不変なもので、それをどこのタイムゾーンから参照しているに過ぎないのです。
タイムゾーンとは
タイムゾーンとは地球上の異なる地域における標準時刻を指します。地球は24のタイムゾーンに分割されており、各タイムゾーンはおおよそ経度15度ごとに設定されています。
±9hしてはいけない理由
先ほど2024年1月1日9:00(JST) と2024年1月1日0:00(UTC)の実体は「1704067200」と解説しました。
ここで直接±9hの処理を行うと「1704067200」(UNIX時間)に変更を行うことになります。
そうです!不変なUNIX時間を変更していることになります。
ではどうするか
タイムゾーンを変更しましょう。
例えばPythonのライブラリを使うと
from datetime import datetime
import pytz
# UTCでのdatetimeオブジェクトを作成
utc_time = datetime(2024, 1, 1, 0, 0, 0, tzinfo=pytz.utc)
print(f"UTC: {utc_time}")
# 日本標準時(JST)のタイムゾーンを取得
jst = pytz.timezone('Asia/Tokyo')
# JSTに変換
jst_time = utc_time.astimezone(jst)
print(f"JST: {jst_time}")
以下が結果です。
UTC time: 2024-01-01 00:00:00+00:00
JST time: 2024-01-01 09:00:00+09:00
timedeltaを使用する場合
import datetime
date_str = "2024-01-01 00:00:00"
dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
# UTCからJSTへのオフセットを計算 (JSTはUTC+9時間)
offset = datetime.timedelta(hours=9)
# オフセットを適用してJST時間を計算
dt_jst = dt + offset
# 文字列として出力
print("JST time: " + dt_jst.strftime('%Y-%m-%d %H:%M:%S'))
以下が結果
JST time: 2024-01-01 09:00:00
+9時間しているように見えますがタイムゾーンの時差を指定しているだけなのでUNIX時間は変わりません。
まとめ
UNIX時間を変更することはやめましょう。
タイムゾーンを変更しましょう。
余談
GCPでは時間がUTCで表示されます。
これはUTCで時間を持っているわけでなく、持っているのはあくまでUnix時間でそれをUTCで表示しているだけです。
UTCで持っている は
はニュアンスが違います。
UTCで表示しているだけです。