python datetimeの使い方
概要
- ISO8601(RFC3339)という企画がある
- UTCの例
YYYY-mm-ddTHH:MM:SSZ
YYYY-mm-ddTHH:MM:SS+00:00:
- JSTの例
YYYY-mm-ddTHH:MM:SS+09:00
- UTCの例
- ISO8601に適合した出力を得るには、
.isoformat()
関数が必要- デフォルトでは
microseconds
まで表示されるので、timespec="seconds"
まで表示される
- デフォルトでは
各種初期化方法
- 日付の粒度で初期化
datetime.date(2099, 11, 3)
yyyy-mm-dd HH:MM:SS
の粒度で初期化datetime.datetime(2099, 11, 3, 10, 30, 15, 0)
- 最後はmicro seconds
- 現在の時刻で初期化
datetime.now()
具体例
import datetime
import pytz
dt = datetime.datetime.now()
# pythonデフォルトのisoformat
print(dt.isoformat()) # 2022-08-31T04:45:33.576946
# UTCでISO8601を適応した例
# JavaScript互換なので、開発時には便利
# システムのTZが優先されることもあり、使用に注意が必要
print(dt.strftime("%Y-%m-%dT%H:%M:%SZ")) # 2022-08-31T04:45:33Z
# JSTでISO8601を適応した例
jst_dt = dt.astimezone(pytz.timezone('Asia/Tokyo'))
print(jst_dt.isoformat()) # 2022-08-31T13:32:50.675778+09:00
# secondsでオフセットをつけて、インラインで時刻の誤解がなく、文字列として出力する
print(datetime.datetime.now().astimezone(pytz.timezone("UTC")).isoformat(timespec='seconds')) # 2022-09-01T06:18:11+00:00 (日本時間の15:18に実行)
注意点
strftime
で出力される値はタイムゾーンが設定されている場合は暗黙的にそのタイムゾーンの出力になる- つまり、
dt.strftime("%Y-%m-%dT%H:%M:%SZ")
は場合によっては期待した動作をしない isoformat()
で得られた文字列を加工するほうが安全
- つまり、