避坑手冊!Python 對比兩個 datetime 大小的坑

ponponon發表於2022-04-07

Python 時間處理的各種坑的總結

TypeError: can't compare offset-naive and offset-aware datetimes

Python 和 pydantic 結合處理各種時區問題

比較兩個時間

需要注意是否包含時區資訊,如果一個 datetime 包含時區資訊,另一個不包含時區資訊,是會報錯的!

from datetime import datetime, timezone, date
from pydantic import BaseModel, Field


def get_utc_now_timestamp() -> datetime:
    return datetime.utcnow().replace(tzinfo=timezone.utc)


class Struct(BaseModel):
    create_at: datetime | None


s = Struct(create_at='1970-01-01 00:00:00')

assert s.create_at < get_utc_now_timestamp()

報錯如下:

Traceback (most recent call last):
  File "/Users/bot/Desktop/code/ideaboom/test_pydantic/001.py", line 29, in <module>
    assert s.create_at < get_utc_now_timestamp()
TypeError: can't compare offset-naive and offset-aware datetimes

原因:

  • offset-naive是不含時區的型別,
  • offset-aware是有時區型別

解決方案:

  • 都帶上時區資訊,

    • 可以使用 datetime 的 replace 方法新增時區資訊,比如 replace(tzinfo=timezone.utc)
    • 或者原始的時間字串就帶上時區資訊,比如 s = Struct(create_at='1970-01-01 00:00:00+08:00')
  • 或者都不帶時區資訊,可以使用 datetime 的 replace 方法去除時區資訊,比如 replace(tzinfo=None)

參考文章:

received a naive datetime while time zone support is active

python datetime offset-aware與offset-navie相互轉換

python - 如何從日期時間物件中刪除pytz時區?

相關文章