如何在 Python 中获取“时区感知”的 datetime.today() 值?

新手上路,请多包涵

我试图从 datetime.datetime.today() 的值中减去一个日期值来计算某事发生在多长时间前。但它抱怨:

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

datetime.datetime.today() 的返回值似乎不是“时区感知”,而我的其他日期值是。如何从 datetime.datetime.today() 获取时区感知的返回值?

理想的解决方案是让它自动知道时区。

现在,它给我的时间是当地时间,恰好是太平洋标准时间,即 UTC - 8 小时。最坏的情况是,有没有一种方法可以手动将时区值输入 datetimedatetime.datetime.today() 返回的对象并将其设置为 UTC-8?

原文由 mindthief 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 320
2 个回答

在标准库中,如果不创建自己的时区类,就没有跨平台的方法来创建感知时区。 ( 编辑: 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() 返回 本地 时间,而不是 UTC 时间,因此应用 .replace(tzinfo=pytz.utc) 是不正确的。

另一个很好的方法是:

 datetime.now(pytz.utc)

这是有点短,但做同样的事情。


进一步阅读/观看为什么在许多情况下更喜欢 UTC:

原文由 AndiDog 发布,翻译遵循 CC BY-SA 4.0 许可协议

获取特定时区的当前时间:

 import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))

记得先安装 pytz

原文由 philfreo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题