PythonでUNIX時間(エポック秒)と日時datetimeを相互変換
UNIX時間(エポック秒)は協定世界時 (UTC) での1970年1月1日午前0時0分0秒からの経過秒数。Pythonでは、UNIX時間(エポック秒)と日時(日付と時刻)を表すdatetime
型のオブジェクトを相互に変換できる。
日時を処理するdatetimeモジュールについての基本的な内容は以下の記事を参照。
UNIX時間はファイルのタイムスタンプ(作成日時や更新日時)を表す際にも用いられる。また、現在時刻のUNIX時間はtime.time()
で取得できる。詳細は以下の記事を参照。
UNIX時間(エポック秒)とは
UNIX時間(エポック秒)は協定世界時 (UTC) での1970年1月1日午前0時0分0秒からの経過秒数。POSIXタイムや、UNIXタイムスタンプなどと呼ばれることもある。
UNIX時間(ユニックスじかん)またはUNIX時刻(ユニックスじこく、UNIX time(ユニックスタイム)、POSIX time(ポジックスタイム))とはコンピューターシステム上での時刻表現の一種。UNIXエポック、すなわち協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数(すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの)として表される。
UNIX時間 - Wikipedia
UNIX時間を日時datetimeに変換: fromtimestamp()
Pythonで日時を処理するには標準ライブラリのdatetimeモジュールを使うと便利。
UNIX時間(エポック秒)をdatetime
オブジェクトに変換するにはdatetime
モジュールのdatetime.fromtimestamp()
を使う。引数にUNIX時間を指定する。
上述のように、UNIX時間は協定世界時 (UTC) での1970年1月1日午前0時0分0秒からの経過秒数。デフォルトではローカルな日時に変換されるため、例えば日本標準時(JST)環境のマシンで実行した場合は時差(+9時間)が考慮された値になる。
環境の影響をわかりやすくするため引数にUNIX時間として0
を指定すると以下のような結果となる。
import datetime
dt = datetime.datetime.fromtimestamp(0)
print(dt)
# 1970-01-01 09:00:00
print(type(dt))
# <class 'datetime.datetime'>
print(dt.tzinfo)
# None
デフォルトではtzinfo
属性がNone
のnaiveなdatetime
オブジェクトが返される。
第二引数tz
にタイムゾーンを指定するとtzinfo
属性が設定され、日時がそのタイムゾーンに正しく変換されたawareなdatetime
オブジェクトが返される。
dt_utc_aware = datetime.datetime.fromtimestamp(0, datetime.timezone.utc)
print(dt_utc_aware)
# 1970-01-01 00:00:00+00:00
print(dt_utc_aware.tzinfo)
# UTC
dt_jst_aware = datetime.datetime.fromtimestamp(0, datetime.timezone(datetime.timedelta(hours=9)))
print(dt_jst_aware)
# 1970-01-01 09:00:00+09:00
print(dt_jst_aware.tzinfo)
# UTC+09:00
協定世界時(UTC)のnaiveなdatetime
オブジェクト( tzinfo
属性がNone
)を返すdatetime.utcfromtimestamp()
もある。
dt_utc_naive = datetime.datetime.utcfromtimestamp(0)
print(dt_utc_naive)
# 1970-01-01 00:00:00
print(dt_utc_naive.tzinfo)
# None
タイムゾーンについての詳細は以下の記事を参照。
日時datetimeをUNIX時間に変換: timestamp()
datetime
オブジェクトをUNIX時間に変換するにはtimestamp()
メソッドを使う。浮動小数点数float
型のUNIX時間が返される。
上のサンプルコードで生成したdatetime
オブジェクトを例とする。
print(dt)
# 1970-01-01 09:00:00
print(dt.timestamp())
# 0.0
print(type(dt.timestamp()))
# <class 'float'>
tzinfo
属性がNone
のnaiveなオブジェクトは実行中の環境のタイムゾーンのものとして処理され、tzinfo
属性が設定されたawareなオブジェクトはそのタイムゾーンをもとに処理される。
utcfromtimestamp()
で生成したオブジェクトは、UTCでnaive(tzinfo
属性がNone
)であるため、そのほかのオブジェクトと結果が異なるので注意。
print(dt_utc_aware)
# 1970-01-01 00:00:00+00:00
print(dt_utc_aware.timestamp())
# 0.0
print(dt_jst_aware)
# 1970-01-01 09:00:00+09:00
print(dt_jst_aware.timestamp())
# 0.0
print(dt_utc_naive)
# 1970-01-01 00:00:00
print(dt_utc_naive.timestamp())
# -32400.0
特にタイムゾーンを考慮する必要がなければ、fromtimestamp()
においてもtimestamp()
においてもローカルな時刻をもとに処理されるので気にしなくても大丈夫。