PythonでUNIX時間を実時間に変換する

お困りの方へ

この記事では、UNIX時間(POSIXタイムスタンプ)という数値を実時間に変換してみます。


Wikipediaでは「UNIX時間またはUNIX時刻、POSIX timeとはコンピューターシステム上での時刻表現の一種。協定世界時(UTC)での1970年1月1日午前0時0分0秒から形式的な経過秒数として表される。」となっています。

現在時刻のUNIX時間を取得する

現在時刻のUNIX時間を取得するには、datetime.timestamp関数を使います。

2024-09-01 09:00:00のUNIX時間は1725148800.0となりました。

from datetime import datetime, timezone
from dateutil import tz
JST = tz.gettz('Asia/Tokyo')
UTC = tz.gettz('UTC')

# 現在の時刻を1時間単位に丸める。
now = datetime.now().replace(minute=0, second=0, microsecond=0)
print(now)
print(type(now))

# 2024-09-01 09:00:00
# <class 'datetime.datetime'>

# POSIXタイムスタンプに変換する。
now_posix = now.timestamp()
print(now_posix)
print(type(now_posix))

# 1725148800.0
# <class 'float'>

UNIX時間は経過秒数なので、UTCでもJSTでも同じ数値となります。

now_utc = datetime.now(timezone.utc).replace(minute=0, second=0, microsecond=0)
print(now_utc)

# 2024-09-01 00:00:00+00:00

now_jst = datetime.now(JST).replace(minute=0, second=0, microsecond=0)
print(now_jst)

# 2024-09-01 09:00:00+09:00

now_utc_posix = now_utc.timestamp()
print(now_utc_posix)

# 1725148800.0

now_jst_posix = now_jst.timestamp()
print(now_jst_posix)

# 1725148800.0

datetime.timestampの仕様書です。詳しい仕様はこちらをご覧ください。

UNIX時間をdatetime.fromtimestampで実時間に変換する

UNIX時間を実時間に変換するには、datetime.fromtimestamp関数を使用します。
上のサンプルコードで取得した、UNIX時間1725148800[秒]を使用して実時間に変換してみます。

UNIX時間1725148800は、実時間では2024-09-01 09:00:00となりました。

t = datetime.fromtimestamp(1725148800)
print(t)
print(type(t))

# 2024-09-01 09:00:00
# <class 'datetime.datetime'>

UNIX時間をUTCやJSTに変換してみました。
UTCとJSTの時差は9時間なので、正しく変換されています。

from datetime import datetime, timezone
from dateutil import tz
JST = tz.gettz('Asia/Tokyo')
UTC = tz.gettz('UTC')

# POSIXタイムスタンプをUTC時刻に変換する。
utc = datetime.fromtimestamp(1725148800, UTC)
print(utc)

# 2024-09-01 00:00:00+00:00

# POSIXタイムスタンプをJST時刻に変換する。
jst = datetime.fromtimestamp(1725148800, JST)
print(jst)

# 2024-09-01 09:00:00+09:00

たまに与えられたUNIX時間の単位がマイクロ秒になっていることがあります。
datetime.fromtimestamp(timestamp)の引数timestampの単位は[秒]です。
なので、timestampは10桁の数字となります。
マイクロ秒で渡すとOSErrorが返ってきます。

t = datetime.fromtimestamp(1726012800000)
# OSError: [Errno 22] Invalid argument

t = datetime.fromtimestamp(1726012800000/1000)
print(t)
# 2024-09-11 09:00:00
# 10桁の数字にして単位を秒にする。

datetime.fromtimestampの仕様書です。詳しい仕様はこちらをご覧ください。