Pythonの開発現場において、日付や時刻の情報を文字列として扱う機会は非常に多く存在します。
システムログの記録やデータベースへの保存、Web APIを通じたデータのやり取りなど、その用途は多岐にわたります。
こうした場面で最も重要視されるのが、データの「相互運用性」です。
異なるシステムやプログラミング言語間で日付情報を正しく受け渡すためには、共通の規格に従ったフォーマットが欠かせません。
Pythonのdatetimeモジュールに用意されているisoformatメソッドは、国際標準規格であるISO 8601形式の文字列を生成するための標準的な手段です。
本記事では、isoformatメソッドの基本的な使い方から、実務で役立つ詳細なカスタマイズ方法まで、2026年現在の最新仕様を踏まえて解説します。
isoformatメソッドの基本概念と役割
isoformatメソッドは、datetimeオブジェクト、dateオブジェクト、timeオブジェクトが持つ、自身を文字列に変換するためのメソッドです。
このメソッドが生成する文字列は、世界的に広く普及しているISO 8601という規格に基づいています。
ISO 8601規格とは何か
ISO 8601は、日付と時刻の表記に関する国際規格です。
「年-月-日T時:分:秒」といった形式で構成され、辞書順でのソートが可能であることや、タイムゾーン情報の付与が明確であるといった特徴があります。
現代のITシステムにおいて、日付データを文字列でやり取りする際のデファクトスタンダード(事実上の標準)と言っても過言ではありません。
strftimeメソッドとの違い
Pythonには、日付を文字列に変換するもう一つの強力なメソッドとしてstrftimeがあります。
strftimeは、フォーマット識別子(%Yや%mなど)を組み合わせて、自由な形式で文字列を出力できるのが利点です。
しかし、自由度が高い反面、開発者がフォーマットを定義する必要があり、コードの記述量が増える傾向にあります。
一方でisoformatは、引数なしで呼び出すだけで標準規格に準拠した出力を得られるため、定型的なデータ交換において非常に効率的です。
isoformatメソッドの基本的な使い方
まずは、最もシンプルにisoformatを使用する例を見ていきましょう。
datetimeクラスから現在の時刻を取得し、それを文字列に変換する手順は以下の通りです。
from datetime import datetime
# 現在時刻の取得
now = datetime.now()
# ISO 8601形式の文字列に変換
iso_string = now.isoformat()
print(f"型: {type(iso_string)}")
print(f"値: {iso_string}")
型: <class 'str'>
値: 2026-05-09T13:45:30.123456
実行結果を見ると、日付と時刻の間に「T」という文字が含まれていることが分かります。
これがISO 8601規格の標準的なセパレータです。
また、マイクロ秒まで含まれた形式で出力されるのがdatetimeオブジェクトのデフォルトの挙動です。
引数による出力形式のカスタマイズ
isoformatメソッドには、出力される文字列の形式を細かく制御するための引数が用意されています。
セパレータの変更(sep引数)
デフォルトでは日付と時刻の区切り文字として「T」が使用されますが、sep引数を使うことでこれを任意の一文字に変更できます。
例えば、スペース区切りで出力したい場合は以下のように記述します。
from datetime import datetime
now = datetime.now()
# 区切り文字をスペースに変更
custom_format = now.isoformat(sep=' ')
print(custom_format)
2026-05-09 13:45:30.123456
ログファイルへの出力など、人間が読みやすい形式にしたい場合に便利ですが、厳密な規格からは外れる可能性がある点に注意してください。
精度の制御(timespec引数)
timespec引数を使用すると、出力する時刻の精度(どの単位まで表示するか)を指定できます。
指定できる値には、’auto’, ‘hours’, ‘minutes’, ‘seconds’, ‘milliseconds’, ‘microseconds’があります。
from datetime import datetime
now = datetime.now()
# 秒単位までの出力
print(f"Seconds: {now.isoformat(timespec='seconds')}")
# ミリ秒単位までの出力
print(f"Milliseconds: {now.isoformat(timespec='milliseconds')}")
# 分単位までの出力
print(f"Minutes: {now.isoformat(timespec='minutes')}")
Seconds: 2026-05-09T13:45:30
Milliseconds: 2026-05-09T13:45:30.123
Minutes: 2026-05-09T13:45
データベースの仕様やAPIの定義に合わせて、余計なマイクロ秒を切り捨てたい場合に非常に有用なオプションです。
タイムゾーン(オフセット)の扱い
実務的なアプリケーション開発において、タイムゾーンの考慮は避けて通れません。
isoformatは、datetimeオブジェクトがタイムゾーン情報を持っている場合(Awareな状態)、自動的にそのオフセットを文字列に含めてくれます。
Awareなオブジェクトでの出力
Python 3.9以降で推奨されているzoneinfoモジュールを使用して、タイムゾーン付きの文字列を生成してみましょう。
from datetime import datetime
from zoneinfo import ZoneInfo
# 日本標準時(JST)を指定して取得
jst_now = datetime.now(ZoneInfo("Asia/Tokyo"))
print(jst_now.isoformat())
2026-05-09T13:45:30.123456+09:00
出力結果の末尾にある「+09:00」がタイムゾーンのオフセットを示しています。
UTCの表現と「Z」サフィックス
クラウドサービスやWebサービスでは、UTC(協定世界時)を基準にデータをやり取りすることが一般的です。
Python 3.11以降では、UTCを扱う際の利便性が向上しました。
以前はUTCであっても「+00:00」と出力されることが多かったのですが、モダンなコードでは「Z」サフィックス(ズールー時間)を扱う機会が増えています。
from datetime import datetime, UTC
# UTCでの現在時刻取得(Python 3.11+)
utc_now = datetime.now(UTC)
# isoformatでの出力
print(utc_now.isoformat())
2026-05-09T04:45:30.123456+00:00
なお、末尾を「Z」にしたい場合は、文字列置換を行うか、特定のライブラリを併用するのが一般的でしたが、最新のPythonでは互換性の高いfromisoformatが「Z」を解釈できるようになっています。
date型およびtime型でのisoformat
isoformatメソッドは、datetime.datetimeクラスだけでなく、日付のみを扱うdateクラスや時刻のみを扱うtimeクラスでも利用可能です。
dateクラスの使用例
from datetime import date
d = date(2026, 5, 9)
print(d.isoformat())
2026-05-09
timeクラスの使用例
from datetime import time
t = time(13, 45, 0)
print(t.isoformat())
13:45:00
このように、対象のオブジェクトが持つ情報量に応じて適切なISO形式の文字列が生成されます。
逆変換:fromisoformatによるパース
文字列として保存したISO 8601形式のデータを、再びPythonのオブジェクトに戻したいケースも多いでしょう。
その場合は、fromisoformatクラスメソッドを使用します。
これはisoformatの対になる機能であり、非常に高速かつ正確に変換が可能です。
from datetime import datetime
iso_str = "2026-05-09T13:45:30+09:00"
# 文字列からオブジェクトに変換
dt_obj = datetime.fromisoformat(iso_str)
print(f"変換後のオブジェクト: {dt_obj}")
print(f"タイムゾーン: {dt_obj.tzinfo}")
変換後のオブジェクト: 2026-05-09 13:45:30+09:00
タイムゾーン: UTC+09:00
以前のPythonでは複雑な形式のパースが苦手でしたが、近年のバージョンアップにより、多くのISO 8601準拠文字列をそのまま読み込めるようになっています。
実戦的な活用シーン
ここでは、開発現場でisoformatがどのように活用されているか、具体的なシーンを想定して紹介します。
JSONシリアライズでの活用
標準のjsonモジュールは、datetimeオブジェクトをそのままシリアライズ(変換)することができません。
そのため、default引数にisoformatを指定して文字列へ変換する手法がよく使われます。
import json
from datetime import datetime
data = {
"event_name": "Python Conference 2026",
"start_time": datetime.now()
}
# datetimeを文字列に変換しながらJSON化
json_data = json.dumps(data, default=lambda obj: obj.isoformat())
print(json_data)
{"event_name": "Python Conference 2026", "start_time": "2026-05-09T13:45:30.123456"}
ファイル名への利用
バックアップファイルやログファイルの名前に日付を含める際、isoformatは役立ちます。
ただし、ファイル名には「:(コロン)」が使用できないOSがあるため、セパレータの置換やtimespecの調整が必要です。
from datetime import datetime
# ファイル名として使いやすい形式に調整
file_suffix = datetime.now().isoformat(timespec='seconds').replace(':', '-')
file_name = f"backup_{file_suffix}.zip"
print(file_name)
backup_2026-05-09T13-45-30.zip
まとめ
Pythonのisoformatメソッドは、国際標準であるISO 8601形式の文字列を生成するための、最も基本的かつ強力な道具です。
sepやtimespecといった引数を使いこなすことで、多様な要件に合わせたフォーマット出力が可能になります。
また、タイムゾーン情報の付与も標準でサポートされており、グローバルなシステム開発においても信頼性の高いデータ交換を実現します。
手動でフォーマット文字列を記述する前に、まずはisoformatで事足りないかを検討することが、保守性の高いクリーンなコードを書くための第一歩です。
2026年現在のモダンなPython開発では、ZoneInfoやfromisoformatと組み合わせて、安全かつ効率的に日付データを扱っていきましょう。
この記事が、皆さんのプログラミングにおける日付処理の助けになれば幸いです。
