PythonでUNIX時間(エポック秒)と日時datetimeを相互変換

Modified: | Tags: Python, 日時処理

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()においてもローカルな時刻をもとに処理されるので気にしなくても大丈夫。

関連カテゴリー

関連記事