【Python】日時をISO 8601形式の文字列に変換する方法:タイムゾーン対応

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' でミリ秒まで)。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次