PythonでUTC⇔JST datetime, POSIX タイムスタンプ(UnixTime)

日付、時刻をよく利用することがあるので、メモとして掲載します。datetimeとPOSIX タイムスタンプ(UnixTime)を相互変換するサンプルコードです。

UTC⇔JSTの変換サンプルコード


解説

各処理の解説です。

利用するモジュールを宣言します。

from datetime import datetime, timedelta, timezone

それぞれ日付を扱うために利用するクラスであり、datetimeは日時を扱い、timedeltaは経過時間(日付や時刻間の差)を扱い、timezoneは、タイムゾーンを扱います。


UTCからJSTを計算する

# 現在時刻(UTC)をdatetime型で取得する
dt_utc = datetime.now(timezone.utc)
print("UTC        : {}, type : {}".format(dt_utc, type(dt_utc)))

# UTC -> JST
JST = timezone(timedelta(hours=+9))
utc_jst = dt_utc.astimezone(JST)
print("UTC -> JST : {}, type : {}".format(utc_jst, type(utc_jst)))

datetime.now()に引数としてtimezone.utcを指定してdatetime型のUTC日時を取得します。 timezone.utc を指定しない場合、ローカル時間(プログラムが実行されているパソコンやサーバーの設定時間)が取得されます。

UTCからJSTへの変換には、datatime.astimezone()にUTCとJSTの時差+9を追加したタイムゾーン(サンプルの場合、JST)を指定します。UTCはデフォルトでtimezone.utcに定義されていますが、JSTは自分で定義する必要があります。


JSTからUTCを計算する

jst_utc = utc_jst.astimezone(timezone.utc)
print("JST -> UTC : {}, type : {}".format(dt_utc, type(dt_utc)))

JSTからUTCを指定する際にも、datetime.astimezone()へUTCのタイムゾーンを指定します。


JSTを取得する

# 現在時刻(JST)をdatetime型で取得する
JST = timezone(timedelta(hours=+9))
dt_jst = datetime.now(JST)
print("JST        : {}, type : {}".format(dt_jst, type(dt_jst)))

datetime.now()へJSTのタイムゾーンを指定します。


datetime -> POSIXタイムスタンプ(UnixTIme)とその逆

# 現在時刻(UTC)をPOSIXタイムスタンプ(float型)で取得する
ts_utc = dt_utc.timestamp()
print("timestamp utc : {}, type : {}".format(ts_utc, type(ts_utc)))

# 現在時刻(JST)をPOSIXタイムスタンプ(float型)で取得する
ts_jst = dt_jst.timestamp()
print("timestamp jst : {}, type : {}".format(ts_jst, type(ts_jst)))

# POSIXタイムスタンプ(float型)をもう一度datetimeに変換する
dt_jst_2 = datetime.fromtimestamp(ts_jst, JST)
print("timestamp -> datatime2 : {}".format(dt_jst_2))
print("datatime == datatime2  : {}".format(dt_jst == dt_jst_2))

datetime.timestamp()でdatetimeをPOSIXタイムスタンプに変換します。

POSIXタイムスタンプをdatetimeに変換するには、timestamp()を使います。