共计 1021 个字符,预计需要花费 3 分钟才能阅读完成。
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 办法增加时区信息,比方
- 或者都不带时区信息,能够应用 datetime 的 replace 办法去除时区信息,比方
replace(tzinfo=None)
参考文章:
received a naive datetime while time zone support is active
python datetime offset-aware 与 offset-navie 互相转换
python – 如何从日期工夫对象中删除 pytz 时区?
正文完