Pythonのdatetime
モジュールを使って、ISO8601形式(末尾が”Z”でミリ秒まで)の日時文字列を扱う方法について説明します。
datetimeオブジェクトをISO8601形式の文字列に変換する
Pythonのdatetime
オブジェクトをISO8601形式の文字列に変換するには、strftime
関数を使用します。以下に例を示します。
import datetime
dt = datetime.datetime(2021, 1, 1, 2, 3, 4, 123456, tzinfo=datetime.timezone.utc)
expected = "2021-01-01T02:03:04.123Z"
actual = dt.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
print(actual) # '2021-01-01T02:03:04.123456Z'
しかし、この方法ではマイクロ秒まで出力されてしまいます。ミリ秒までの出力を得るには、以下のようにisoformat
メソッドと文字列操作を組み合わせます。
tmp = dt.isoformat(timespec="milliseconds")
print(tmp) # 2021-01-01T02:03:04.123+00:00
actual = tmp[0:23] + "Z"
print(actual) # 2021-01-01T02:03:04.123Z
UTCのdatetimeオブジェクトのISO形式が”Z”を含まない理由
Pythonのdatetimeオブジェクトはデフォルトでタイムゾーン情報を持たないため、UTCのdatetimeオブジェクトのISO形式には”Z”が含まれません。これはISO 8601の仕様(タイムゾーン情報がない場合はローカルタイムとみなす)に反しています。
まとめ
PythonでISO8601形式の日時文字列を扱うには、datetime
モジュールのstrftime
やisoformat
メソッドを使用します。ただし、UTCのdatetimeオブジェクトのISO形式に”Z”を含めるには、追加の文字列操作が必要です。