我试图从 datetime.datetime.today()
的值中减去一个日期值,以计算某件事是多久以前的。但它提示:
TypeError: can't subtract offset-naive and offset-aware datetimes
datetime.datetime.today()
的返回值似乎不是“时区感知”,而我的其他日期值是。如何从 datetime.datetime.today()
获取时区感知的返回值?
理想的解决方案是让它自动知道时区。
现在,它给我的是本地时间,恰好是 PST,即 UTC - 8 小时。最坏的情况,有没有办法可以手动将时区值输入到 datetime.datetime.today()
返回的 datetime
对象并将其设置为 UTC-8?
最佳答案
在标准库中,没有创建自己的时区类的跨平台方法来创建感知时区。 (编辑: Python 3.9 在提供此功能的标准库中引入了zoneinfo
。)
在 Windows 上,有 win32timezone.utcnow()
,但这是 pywin32 的一部分。我宁愿建议使用 pytz library ,它有一个不断更新的大多数时区数据库。
使用本地时区可能非常棘手(请参阅下面的“进一步阅读”链接),因此您可能更希望在整个应用程序中使用 UTC,尤其是对于算术运算,例如计算两个时间点之间的差异。
您可以像这样获取当前日期/时间:
import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)
请注意 datetime.today()
和 datetime.now()
返回 local 时间,而不是 UTC 时间,因此应用 .replace(tzinfo=pytz.utc)
对他们来说是不正确的。
另一个不错的方法是:
datetime.now(pytz.utc)
这有点短,但作用相同。
进一步阅读/观看为什么在许多情况下更喜欢 UTC:
- pytz documentation
- What Every Developer Should Know About Time – 许多现实生活用例的开发提示
- The Problem with Time & Timezones - Computerphile – 关于使用时区的复杂性的有趣、令人大开眼界的解释(视频)
关于python - 如何在 Python 中获取 "timezone aware"的 datetime.today() 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530069/