今回は、日付と時刻に関する少し発展的な内容として、以下の2つを学習しました。
-
struct_time:時間情報の構造体(分解して扱える) -
ZoneInfo:タイムゾーンの扱い方(Python 3.9以降)
後半では、astimezone() というタイムゾーン変換メソッドについてもまとめています。
struct_time:時間情報の構造体
struct_time は、time.localtime() や time.gmtime() などの関数で返ってくる時間情報のまとまりです。
タプルのようにインデックスでも、属性名でもアクセスできます。
import time
t = time.localtime()
print(t)
実行例:
time.struct_time(tm_year=2025, tm_mon=6, tm_mday=15, tm_hour=15, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=166, tm_isdst=0)
それぞれの属性は次のような意味があります:
| 属性名 | 意味 | 例 |
|---|---|---|
tm_year |
年 | 2025 |
tm_mon |
月(1〜12) | 6 |
tm_mday |
日(1〜31) | 15 |
tm_hour |
時(0〜23) | 15 |
tm_min |
分(0〜59) | 0 |
tm_sec |
秒(0〜59) | 0 |
tm_wday |
曜日(0=月, 6=日) | 6 |
tm_yday |
年内通算日(1〜366) | 166 |
tm_isdst |
サマータイムか否か | 0(非対応) |
属性へのアクセス例:
print(t.tm_year) # 2025
print(t.tm_wday) # 6(日曜日)
日付や時刻を分解して扱いたいときに便利です。
ZoneInfo:タイムゾーンを扱う(Python 3.9以降)
Python 3.9からは zoneinfo モジュールが標準で使えるようになり、タイムゾーン付きの日時処理が可能になりました。
たとえば「UTC」から「日本時間(Asia/Tokyo)」への変換も簡単にできます。
from datetime import datetime
from zoneinfo import ZoneInfo
# タイムゾーンを指定して現在時刻を取得
dt_tokyo = datetime.now(ZoneInfo("Asia/Tokyo"))
dt_utc = datetime.now(ZoneInfo("UTC"))
print("Tokyo:", dt_tokyo)
print("UTC :", dt_utc)
出力例:
Tokyo: 2025-06-15 15:00:00+09:00
UTC : 2025-06-15 06:00:00+00:00
他のタイムゾーンの例
"America/New_York""Europe/London""Asia/Shanghai""Asia/Tokyo"
astimezone() でタイムゾーンを変換する
あるタイムゾーンの日時を別のタイムゾーンに変換したいときは、astimezone() メソッドを使います。
このメソッドは、単に tzinfo を変えるだけでなく、実際の時刻を変換してくれる点が重要です。
例:UTC→日本時間
from datetime import datetime
from zoneinfo import ZoneInfo
# UTC時間を作成
dt_utc = datetime(2025, 6, 15, 6, 0, tzinfo=ZoneInfo("UTC"))
# 東京時間に変換
dt_tokyo = dt_utc.astimezone(ZoneInfo("Asia/Tokyo"))
print("UTC時間:", dt_utc)
print("東京時間:", dt_tokyo)
実行結果:
UTC時間: 2025-06-15 06:00:00+00:00
東京時間: 2025-06-15 15:00:00+09:00
✅ よくある誤解:tzinfo= と astimezone() の違い
-
tzinfo=ZoneInfo(...)→ タイムゾーン「情報だけをつける」だけで、時刻の数値はそのまま。 -
astimezone(...)→ 実際の時刻を変換する(タイムゾーン間の「時差」を反映して新しい日時を計算)
astimezone のよくある使い道
- サーバーで記録した UTC 時刻を、ユーザーのタイムゾーンで表示したいとき
- 国際化対応の Web アプリで、現地時間に変換する必要があるとき
- ログなどの時刻を「見やすい形」に調整したいとき
おわりに
今回は、Pythonで時刻を扱う際に知っておきたい2つの概念
-
struct_time:時刻情報を分解して取り出すための構造体 -
ZoneInfo:タイムゾーン付きの日時処理(+astimezone()による変換)
について学習しました。
astimezone() の動作は最初少し混乱しやすいですが、「タイムゾーンを変えると時刻も変わる」という理解が大切だと思いました。
Python 3.9以降でないと zoneinfo は使えないので、使用環境のバージョン確認も忘れずにしたいと思います。