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

UNIX時間(エポック秒)は協定世界時 (UTC) での1970年1月1日午前0時0分0秒からの経過秒数。Pythonでは、UNIX時間(エポック秒)と日時(日付と時刻)を表すdatetime型のオブジェクトとを相互に変換することができます。 ここでは以下の内容について説明します。

UNIX時間(エポック秒)とは UNIX時間を日時datetimeに変換 日時datetimeをUNIX時間に変換

日時を処理する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に変換

Pythonで日時を処理するには標準ライブラリのdatetimeモジュールを使うと便利です。datetimeモジュールの基本的な内容は

UNIX時間(エポック秒)をdatetimeオブジェクトに変換するにはdatetimeモジュールのdatetime.fromtimestamp()を使います。引数にUNIX時間を指定します。

datetime.fromtimestamp() --- 基本的な日付型および時間型 — Python 3.7.2 ドキュメント

上述のように、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()もあります。

datetime.utcfromtimestamp --- 基本的な日付型および時間型 — Python 3.7.2 ドキュメント

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時間に変換

datetimeオブジェクトをUNIX時間に変換するにはtimestamp()メソッドを使います。浮動小数点数float()のUNIX時間が返されます。

datetime.timestamp() --- 基本的な日付型および時間型 — Python 3.7.2 ドキュメント

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

Last Updated: 6/26/2019, 10:34:03 PM