この記事について
唐突ですが、以前作成した社内ボットが動かなくなりました。。。
原因を調べてみると、Pythonのdatetime型の比較処理が原因だったので、まとめてみました。
修正の変遷
- get_atom関数を実行してみるとこのようなエラーが出ました。
>python main.py
Traceback (most recent call last):
File "main.py", line 36, in <module>
main()
File "main.py", line 14, in main
msg_arr = atom.get_atom()
File "C:\Users\XXX\Documents\XXX\slack-qiita-bot\bot\atom.py", line 21, in get_atom
tdatetime = dt.strptime(d_atom['entries'][i]['published'], '%Y-%m-%dT%H:%M:%SZ')
File "C:\Users\XXX\anaconda3\envs\qiita_slack_bot\lib\_strptime.py", line 577, in _strptime_datetime
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
File "C:\Users\XXX\anaconda3\envs\qiita_slack_bot\lib\_strptime.py", line 359, in _strptime
(data_string, format))
ValueError: time data '2021-11-28T10:59:10+09:00' does not match format '%Y-%m-%dT%H:%M:%SZ'
- 該当箇所のフォーマットを修正してみました
- QiitaのUI変更に伴い、atomの表記が変わったのではないかと思っています
- どちらにしても、タイムゾーンの処理をさぼっているのは間違いないですね
- tdatetime = dt.strptime(d_atom['entries'][i]['published'], '%Y-%m-%dT%H:%M:%SZ')
+ tdatetime = dt.strptime(d_atom['entries'][i]['published'], '%Y-%m-%dT%H:%M:%S%z')
- 今度は違うエラーが出ました
>python main.py
Traceback (most recent call last):
File "main.py", line 36, in <module>
main()
File "main.py", line 14, in main
msg_arr = atom.get_atom()
File "C:\Users\XXX\Documents\XXX\slack-qiita-bot\bot\atom.py", line 26, in get_atom
if not from_time <= tdatetime <= to_time:
TypeError: can't compare offset-naive and offset-aware datetimes
-
こちらの記事によると、タイムゾーンが含まれているdatetimeとタイムゾーンが含まれていないdatetimeは比較できないようです。
実際にdatetimeを格納している変数を比較すると確かに違います
2021-12-10 17:29:39.265024
2021-12-10 18:29:39.265024
2021-11-28 10:59:10+09:00
- タイムゾーンが含まれていないdatetimeにもタイムゾーンを追加します
- if not from_time <= tdatetime <= to_time:
+ if not from_time.astimezone() <= tdatetime.astimezone() <= to_time.astimezone():
- 正常に比較できたようです
2021-12-10 17:41:06.174746+09:00
2021-12-10 18:41:06.174746+09:00
2021-11-28 10:59:10+09:00
まとめ
datetime型のタイムゾーンはちゃんとに処理しましょう