22.

Pythonでタイムゾーン付き現在日時を取得|zoneinfo・strftime・ISO 8601

編集
この記事の要点
  • Python でタイムゾーン付きの現在日時を取得するには datetime.now(tz) を使う
  • タイムゾーンは pytz または zoneinfo(Python 3.9+ 標準)で生成 — timezone('Asia/Tokyo')
  • 文字列化は strftime('%Y-%m-%d %H:%M:%S')、ISO 8601 形式は isoformat()
  • naive(タイムゾーンなし)aware(タイムゾーン付き)の datetime は区別される。混在させると例外
  • Python 3.9 以降は標準ライブラリ zoneinfo 推奨。pytz は古いコードや 3.8 以前互換用

タイムゾーンと現在日時の取得とは

サーバが UTC で稼働している場合や、複数地域のユーザーを相手にするアプリでは、「いつのこと?」を正しく扱うためにタイムゾーンを意識した日時処理が必須です。Python では datetime モジュールに加え、pytz または zoneinfo でタイムゾーンを取り扱います。

方式の選び方

方式Python バージョン推奨度
zoneinfo(標準)3.9 以上★★★(推奨)
pytz(サードパーティ)3.8 以下も可★★(互換用途)
datetime.timezone 直接3.2 以上★(簡易用途)

1. zoneinfo(Python 3.9+ 推奨)

インポート

from datetime import datetime
from zoneinfo import ZoneInfo

現在日時の取得

jst = ZoneInfo('Asia/Tokyo')
now = datetime.now(jst)
print(now)
# 2026-06-11 14:30:00+09:00

文字列化

# strftime で任意フォーマット
now_str = now.strftime('%Y-%m-%d %H:%M:%S')
print(now_str)  # 2026-06-11 14:30:00

# ISO 8601 形式
print(now.isoformat())  # 2026-06-11T14:30:00+09:00

別タイムゾーンへの変換

utc = ZoneInfo('UTC')
ny = ZoneInfo('America/New_York')

now_jst = datetime.now(ZoneInfo('Asia/Tokyo'))
now_utc = now_jst.astimezone(utc)
now_ny  = now_jst.astimezone(ny)

print(now_jst)  # 2026-06-11 14:30:00+09:00
print(now_utc)  # 2026-06-11 05:30:00+00:00
print(now_ny)   # 2026-06-11 01:30:00-04:00

2. pytz(旧来からの定番)

インポート

from datetime import datetime
from pytz import timezone

現在日時の取得

jst = timezone('Asia/Tokyo')
now = datetime.now(jst)
print(now)
# 2026-06-11 14:30:00+09:00

日付の文字列化

now_str = now.strftime('%Y-%m-%d %H:%M:%S')
print(now_str)  # 2026-06-11 14:30:00

pytz の注意点

pytzlocalize() を使わずに datetime(2026, 6, 11, tzinfo=jst) のように直接渡すと、古い時刻の歴史的なオフセットが当たって誤動作することがあります。

# NG: 直接 tzinfo に渡すとオフセットがズレる
naive = datetime(2026, 6, 11, 14, 30)
bad = naive.replace(tzinfo=jst)   # +09:19 とかになる場合がある

# OK: localize を使う
good = jst.localize(naive)        # +09:00 になる

zoneinfo はこの問題がない(タプル渡しの替わりに不可変な情報を持つ)ため、新規コードでは zoneinfo を推奨します。

3. UTC を扱う簡易版

from datetime import datetime, timezone

now_utc = datetime.now(timezone.utc)
print(now_utc.isoformat())
# 2026-06-11T05:30:00+00:00

strftime / strptime フォーマット指定子

指定子意味
%Y4 桁の西暦2026
%m月 (01-12)06
%d日 (01-31)11
%H時 (00-23)14
%M分 (00-59)30
%S秒 (00-59)00
%zUTC オフセット+0900
%Zタイムゾーン名JST
%a / %A曜日(短/長)Thu / Thursday

文字列 → datetime に戻す

from datetime import datetime
from zoneinfo import ZoneInfo

s = '2026-06-11 14:30:00'
naive = datetime.strptime(s, '%Y-%m-%d %H:%M:%S')
aware = naive.replace(tzinfo=ZoneInfo('Asia/Tokyo'))
print(aware)  # 2026-06-11 14:30:00+09:00

# ISO 8601 文字列なら fromisoformat
dt = datetime.fromisoformat('2026-06-11T14:30:00+09:00')
print(dt)     # 2026-06-11 14:30:00+09:00

naive と aware

種類tzinfo用途
naiveNoneタイムゾーン情報なし。地域不明
awaretzinfo を持つタイムゾーン情報あり。正確な時刻

naive と aware を混在させると例外。両方 aware に揃えるか、文字列でやり取りするのが安全です。

from datetime import datetime
from zoneinfo import ZoneInfo

naive = datetime(2026, 6, 11, 14, 30)
aware = datetime(2026, 6, 11, 14, 30, tzinfo=ZoneInfo('Asia/Tokyo'))

# print(aware - naive)  # TypeError!
# 必ず aware に揃える
print(aware - aware.replace(tzinfo=ZoneInfo('UTC')))

よくあるタイムゾーン名

地域タイムゾーン名UTC オフセット
日本Asia/Tokyo+09:00
UTCUTC+00:00
ロンドンEurope/London+00:00 / +01:00 (DST)
ニューヨークAmerica/New_York-05:00 / -04:00 (DST)
ロサンゼルスAmerica/Los_Angeles-08:00 / -07:00 (DST)
シンガポールAsia/Singapore+08:00

FAQ

Q: utcnow() はなぜ非推奨?
A: datetime.utcnow() は naive を返すため、aware と混在しやすく事故の元。Python 3.12 以降は非推奨。datetime.now(timezone.utc) を使いましょう。

Q: Windows で zoneinfo がエラーになる
A: pip install tzdata で IANA タイムゾーンデータベースを追加すると解決します。

関連

  • datetime — 日付・時刻を扱う標準モジュール
  • zoneinfo — IANA タイムゾーン(Python 3.9+)
  • pytz — サードパーティのタイムゾーンライブラリ
  • strftime — フォーマット指定で文字列化
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本的なルール
  2. 変数
  3. 演算子
  4. 標準ライブラリ
  5. 外部ライブラリ
  6. 制御構文
  7. リスト(配列)
  8. タプル
  9. セット
  10. 辞書(dict)
  11. クラスとメソッド
  12. 継承の概念と必要性
  13. 継承の構文
  14. コンストラクタ
  15. cookieの値の設定と取得
  16. 例外処理
  17. 例外を文字列で出力する方法
  18. httpリクエスト(curl)をする方法
  19. Responseオブジェクトの中身の確認
  20. 変数が空かどうか判定する方法
  21. タイムゾーンの設定と現在日時の取得と文字列化
  22. シングルクォーテーションとダブルクォーテーションの違い

最近更新/作成されたページ