Python で UNIX タイムスタンプと datetime を相互変換する
UNIX タイムスタンプは、1970年1月1日 00:00:00 UTC からの経過秒数で時刻を表す形式です。API やデータベースでよく使われるため、datetime との相互変換を覚えておくと便利です。
UNIX タイムスタンプとは
UNIX タイムスタンプ(エポック秒)は、世界中で統一された時刻表現として広く使われています。
1970年1月1日からの経過秒数。例: 1705312200
人間が読める形式。例: 2025-01-15 10:30:00
数値1つで時刻を表せるため、データの保存や通信で重宝されます。
datetime から UNIX タイムスタンプへ
timestamp() メソッドで変換できます。
from datetime import datetime
dt = datetime(2025, 1, 15, 10, 30, 0)
unix_time = dt.timestamp()
print(unix_time) # 1736908200.0
戻り値は浮動小数点数で、小数部分はマイクロ秒を表します。整数が欲しい場合は int() で変換してください。
UNIX タイムスタンプから datetime へ
fromtimestamp() クラスメソッドで変換できます。
from datetime import datetime
unix_time = 1736908200
dt = datetime.fromtimestamp(unix_time)
print(dt) # 2025-01-15 10:30:00
このメソッドはローカルタイムゾーンで解釈します。日本で実行すれば JST(UTC+9)として扱われるわけです。
UTC で扱いたい場合
タイムゾーンを明示的に UTC にしたい場合は、timezone.utc を指定します。
from datetime import datetime, timezone
unix_time = 1736908200
# UTC として変換
dt_utc = datetime.fromtimestamp(unix_time, tz=timezone.utc)
print(dt_utc) # 2025-01-15 01:30:00+00:00
# ローカル(JST)として変換
dt_local = datetime.fromtimestamp(unix_time)
print(dt_local) # 2025-01-15 10:30:00
サーバー間でデータをやり取りする際は、UTC で統一しておくのが一般的です。
utcfromtimestamp は非推奨
Python 3.12 以降、utcfromtimestamp() は非推奨になりました。
from datetime import datetime, timezone
unix_time = 1736908200
# 非推奨(Python 3.12 で DeprecationWarning)
# dt = datetime.utcfromtimestamp(unix_time)
# 推奨される書き方
dt = datetime.fromtimestamp(unix_time, tz=timezone.utc)
print(dt)
タイムゾーン情報を持たない「ナイーブ」な UTC 時刻は混乱の元になるため、明示的にタイムゾーンを指定する方法が推奨されています。
現在時刻の UNIX タイムスタンプ
現在時刻を UNIX タイムスタンプで取得するには、time モジュールも使えます。
import time
from datetime import datetime
# time モジュールを使う方法
unix_time = time.time()
print(unix_time)
# datetime を経由する方法
unix_time = datetime.now().timestamp()
print(unix_time)
どちらも同じ結果になります。すでに datetime を使っているコードなら timestamp() を、シンプルに現在のタイムスタンプだけ欲しいなら time.time() を使うとよいでしょう。