Python講座 / 日付・時刻・タイムゾーンの扱い方
日付だけを扱うときはdate、特定の瞬間とタイムゾーンを扱うときはdatetimeとzoneinfoを使います。タイムゾーン情報のない値と情報を持つ値を区別し、保存と表示の規則を決めることが重要です。
日付・時間差・瞬間を区別する
dateは暦の日付、datetimeは日付と時刻、timedeltaは時間の長さを表します。タイムゾーン情報のないdatetimeをnaive、持つものをawareと呼びます。ソウルの09:00とUTCの09:00は同じ瞬間ではありません。
ISO形式の日付はfromisoformatで解析でき、不正な日付はValueErrorになります。また30日を足すことは、暦の1か月後へ進むことと同じではありません。月末をどう扱うかは業務の規則として決めます。
業務日付の入力とJSON表現は、最終実習:SQLiteの支出管理アプリを作るで扱う規則とつながります。
UTCからソウル時間へ変換する
dates.pyをUTF-8で保存し、プロジェクトの仮想環境でpython dates.pyを実行します。仮想環境外のmacOSやUbuntuでは、環境に応じてpython3を使ってください。
from datetime import date, datetime, timedelta, timezone
from zoneinfo import ZoneInfo
day = date.fromisoformat("2026-10-17")
print(day + timedelta(days=7))
utc = datetime(2026, 10, 17, 0, 0, tzinfo=timezone.utc)
seoul = utc.astimezone(ZoneInfo("Asia/Seoul"))
print(utc.isoformat())
print(seoul.isoformat())
予想結果です。UTCの00:00は、この例ではソウルの09:00になります。
2026-10-24 2026-10-17T00:00:00+00:00 2026-10-17T09:00:00+09:00
変換とタイムゾーンの付与を混同しない
astimezoneは同じ瞬間を別のタイムゾーンで表します。一方replace(tzinfo=...)は時計の各値を保って解釈を付ける操作で、一般的な時差変換の代わりにはなりません。元のタイムゾーンが不明なら正確に変換できない場合があります。
zoneinfoはIANAのタイムゾーンデータを使います。データがない環境でZoneInfoNotFoundErrorになったら、仮想環境でpython -m pip install tzdataを実行します。時差の規則は変わることがあるため、運用するデータも保守が必要です。
保存方針と境界の動作を確認する
取引の発生した瞬間ならUTCなどの一貫した表現で保存して表示時に変換し、支出が属する暦の日だけ必要ならdateで保存する方が明確な場合があります。日付のために根拠のない午前0時を作る必要はありません。
UTCの時刻を23時へ変え、ソウルでは翌日になることを確認します。2026-02-30の解析が拒否されることや、naiveとawareの差を取ると失敗する場合があることも確認して元へ戻します。入力から集計まで、業務上の日付と絶対的な瞬間の違いを保ちます。
時間帯データがない環境では、比較の前に python -m pip install tzdata を実行します。UTCの瞬間をastimezoneで変換するとソウル09:00ですが、replaceで時間帯を付けると00:00のままで別の瞬間になります。awareとnaiveの減算はTypeErrorです。元の時間帯が不明な値を勝手にUTCと解釈してはいけません。
全体を zones.py に保存し、同じ練習フォルダーで python zones.py を実行します。
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc = datetime(2026, 10, 17, 0, 0, tzinfo=timezone.utc)
print(utc.astimezone(ZoneInfo("Asia/Seoul")).isoformat())
print(utc.replace(tzinfo=ZoneInfo("Asia/Seoul")).isoformat())
try:
print(datetime(2026, 10, 17) - utc)
except TypeError:
print("naive and aware cannot be subtracted")
予想結果:
2026-10-17T09:00:00+09:00 2026-10-17T00:00:00+09:00 naive and aware cannot be subtracted
動作と適用条件の公式説明:Python: zoneinfo data sources




