Python で UNIX タイムスタンプと datetime を相互変換する

UNIX タイムスタンプは、1970年1月1日 00:00:00 UTC からの経過秒数で時刻を表す形式です。API やデータベースでよく使われるため、datetime との相互変換を覚えておくと便利です。

UNIX タイムスタンプとは

UNIX タイムスタンプ(エポック秒)は、世界中で統一された時刻表現として広く使われています。

UNIX タイムスタンプ

1970年1月1日からの経過秒数。例: 1705312200

datetime

人間が読める形式。例: 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() を使うとよいでしょう。