Pythonのdatetime型におけるTZの難しさ。
Pythonのdatetimeには二種類あったという話
今このブログのsitemapを作ってるんですが、そのついでにdate周りを整備しようと思ったんですが、案外めんどくさかった。というかいままで意識してなかっった。
まずはdatetimeオブジェクトには二種類ある。
datetime --- 基本的な日付型および時間型 — Python 3.10.4 ドキュメント
ざっくり説明すると
- aware
- timezoneを含む
- naive
- timezoneを含まない
実際のコードで試す
$python
02:10:18 2022
Python 3.8.5 (default, Sep 3 2020, 07:12:45)
[Clang 12.0.0 (clang-1200.0.31.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime, timezone
>>> now = datetime.now()
>>> print(type(now))
<class 'datetime.datetime'>
>>> print(now.tzinfo)
None
>>> print(now.isoformat())
2022-05-22T02:10:39.987654
>>> utc_now = datetime.now(timezone.utc)
>>> print(type(utc_now))
<class 'datetime.datetime'>
>>> print(utc_now.tzinfo)
UTC
>>> print(utc_now.isoformat())
2022-05-21T17:11:28.897259+00:00
こんな感じ。
でも 2022-05-22 02:13
を strptime
したやつはどうしても naive
になってしまう。
2022-05-22T01:53:00+09:00
みたいにして datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S%z')
にすると aware
になるっぽい。
えーめんどくさい…なんかいい感じにならんか考えよう…
追記
BBQしに行った。雨降ってたけどなんやかんや良かった。川と森が良い。
飯能河原 バーベキュー器材レンタルと食材の販売店舗|West River BBQ (ウエストリバーBBQ)
かーらーのー
温泉入った。満足。
ただ、片道2時間はきついねぇ〜