Python 工夫解决的各种坑的总结

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

Python 和 pydantic 联合解决各种时区问题

比拟两个工夫

须要留神是否蕴含时区信息,如果一个 datetime 蕴含时区信息,另一个不蕴含时区信息,是会报错的!

from datetime import datetime, timezone, datefrom pydantic import BaseModel, Fielddef get_utc_now_timestamp() -> datetime:    return datetime.utcnow().replace(tzinfo=timezone.utc)class Struct(BaseModel):    create_at: datetime | Nones = 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时区?