4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

エニプラAdvent Calendar 2021

Day 10

Pythonのdatetime比較でハマった話

Posted at

この記事について

唐突ですが、以前作成した社内ボットが動かなくなりました。。。
原因を調べてみると、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型のタイムゾーンはちゃんとに処理しましょう

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?