Web APIとの連携やデータベースへの保存において、日時データを文字列としてやり取りする際は、国際標準規格である「ISO 8601形式」(例: 2025-12-15T10:00:00+09:00)が広く利用されます。
Pythonの datetime オブジェクトをこの形式に変換するには、isoformat() メソッドを使用します。また、正確な時刻情報を扱うために zoneinfo モジュールを使用してタイムゾーンを明示する方法も合わせて解説します。
目次
実装例:APIリクエスト用のタイムスタンプ生成
日本時間(JST)の現在時刻を取得し、それを他のシステムと連携するためのISO 8601形式の文字列に変換するシナリオを実装します。
ソースコード
from datetime import datetime
from zoneinfo import ZoneInfo
# 1. タイムゾーン情報(JST: 日本標準時)を定義
# Python 3.9以降は標準ライブラリの zoneinfo が使用可能です
jst_timezone = ZoneInfo("Asia/Tokyo")
# 2. タイムゾーン付きの現在時刻を取得
# tz引数を指定することで「Aware(タイムゾーン情報あり)」なオブジェクトになります
current_time_jst = datetime.now(tz=jst_timezone)
# 3. ISO 8601形式の文字列に変換
# T区切り、タイムゾーンオフセット付きの文字列が生成されます
iso_timestamp = current_time_jst.isoformat()
print(f"Datetime Object : {current_time_jst}")
print(f"ISO 8601 String : {iso_timestamp}")
# 参考: 秒の精度を指定したい場合(例: 秒まででマイクロ秒はカット)
iso_timestamp_sec = current_time_jst.isoformat(timespec='seconds')
print(f"ISO 8601 (Sec) : {iso_timestamp_sec}")
実行結果
Datetime Object : 2025-12-15 18:30:45.123456+09:00
ISO 8601 String : 2025-12-15T18:30:45.123456+09:00
ISO 8601 (Sec) : 2025-12-15T18:30:45+09:00
解説
ISO 8601形式とは
日付と時刻を T で区切り、末尾にUTCからの時差(オフセット)を付与した形式です。 上記の出力 +09:00 は、この時刻が協定世界時(UTC)より9時間進んでいること(日本時間)を示しています。これにより、世界中のどの地域のシステムがこのデータを受け取っても、正確な時刻を解釈できます。
zoneinfo と Aware なオブジェクト
datetime.now() を引数なしで呼ぶと、タイムゾーン情報を持たない「Naive(ナイーブ)」なオブジェクトが生成されます。しかし、ISO形式で出力する際はタイムゾーン情報(オフセット)を含めることが推奨されるため、ZoneInfo("Asia/Tokyo") などを指定して「Aware(アウェア)」なオブジェクトとして生成することが重要です。
isoformat() メソッド
- デフォルトでは
YYYY-MM-DDTHH:MM:SS.ffffff+HH:MMの形式で出力されます。 - 引数
timespecを指定することで、精度の調整が可能です(例:'seconds'で秒まで、'milliseconds'でミリ秒まで)。
