閉じる

Pythonでdatetimeを文字列に変換するisoformatの使い方:ISO 8601形式の対応と解説

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クラスから現在の時刻を取得し、それを文字列に変換する手順は以下の通りです。

Python
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引数を使うことでこれを任意の一文字に変更できます。

例えば、スペース区切りで出力したい場合は以下のように記述します。

Python
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’があります。

Python
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モジュールを使用して、タイムゾーン付きの文字列を生成してみましょう。

Python
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」サフィックス(ズールー時間)を扱う機会が増えています。

Python
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クラスの使用例

Python
from datetime import date

d = date(2026, 5, 9)
print(d.isoformat())
実行結果
2026-05-09

timeクラスの使用例

Python
from datetime import time

t = time(13, 45, 0)
print(t.isoformat())
実行結果
13:45:00

このように、対象のオブジェクトが持つ情報量に応じて適切なISO形式の文字列が生成されます。

逆変換:fromisoformatによるパース

文字列として保存したISO 8601形式のデータを、再びPythonのオブジェクトに戻したいケースも多いでしょう。

その場合は、fromisoformatクラスメソッドを使用します。

これはisoformatの対になる機能であり、非常に高速かつ正確に変換が可能です。

Python
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を指定して文字列へ変換する手法がよく使われます。

Python
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の調整が必要です。

Python
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形式の文字列を生成するための、最も基本的かつ強力な道具です。

septimespecといった引数を使いこなすことで、多様な要件に合わせたフォーマット出力が可能になります。

また、タイムゾーン情報の付与も標準でサポートされており、グローバルなシステム開発においても信頼性の高いデータ交換を実現します。

手動でフォーマット文字列を記述する前に、まずはisoformatで事足りないかを検討することが、保守性の高いクリーンなコードを書くための第一歩です。

2026年現在のモダンなPython開発では、ZoneInfofromisoformatと組み合わせて、安全かつ効率的に日付データを扱っていきましょう。

この記事が、皆さんのプログラミングにおける日付処理の助けになれば幸いです。

URLをコピーしました!