首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python语言中获得“时区感知”的datetime.today()值?

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

Stack Overflow用户
提问于 2010-12-25 18:59:50
回答 20查看 433.6K关注 0票数 398

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

代码语言:javascript
复制
TypeError: can't subtract offset-naive and offset-aware datetimes

datetime.datetime.today()似乎不是“时区感知”,而我的另一个date值是“时区感知”。如何获取支持时区的datetime.datetime.today()值?

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

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

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2010-12-25 19:44:34

在标准库中,如果不创建自己的时区类,就没有跨平台的方法来创建可识别的时区。(编辑:Python3.9在提供此功能的标准库中引入了zoneinfo。)

在Windows上有win32timezone.utcnow(),但它是pywin32的一部分。我更倾向于使用pytz library,它有一个不断更新的大多数时区的数据库。

使用本地时区可能非常棘手(请参阅下面的“进一步阅读”链接),因此您可能更希望在整个应用程序中使用UTC,特别是对于计算两个时间点之间的差之类的算术操作。

您可以像这样获取当前的日期/时间:

代码语言:javascript
复制
import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)

请注意,datetime.today()datetime.now()返回的是本地时间,而不是UTC时间,因此对它们应用.replace(tzinfo=pytz.utc)是不正确的。

另一种很好的方法是:

代码语言:javascript
复制
datetime.now(pytz.utc)

它稍微短了一点,而且也是一样的。

进一步阅读/观看在许多情况下首选UTC的原因:

票数 432
EN

Stack Overflow用户

发布于 2013-05-21 08:50:35

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

代码语言:javascript
复制
import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))

记住要先安装pytz

票数 147
EN

Stack Overflow用户

发布于 2016-08-26 22:36:19

在Python 3.2+中:datetime.timezone.utc

标准库使得将UTC指定为时区变得更加容易:

代码语言:javascript
复制
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2020, 11, 27, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)

还可以使用astimezone获取包含本地时间偏移量的datetime

代码语言:javascript
复制
>>> datetime.datetime.now(datetime.timezone.utc).astimezone()
datetime.datetime(2020, 11, 27, 15, 34, 34, 74823, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), 'CET'))

(在Python 3.6+中,您可以将最后一行缩短为:datetime.datetime.now().astimezone())

如果您想要一个仅使用标准库并且在Python2和Python3中都有效的解决方案,请参见jfs' answer

在Python中:zoneinfo要使用3.9+时区数据库:

在Python3.9中,您可以使用标准库、使用zoneinfo指定特定的时区,如下所示:

代码语言:javascript
复制
>>> from zoneinfo import ZoneInfo
>>> datetime.datetime.now(ZoneInfo("America/Los_Angeles"))
datetime.datetime(2020, 11, 27, 6, 34, 34, 74823, tzinfo=zoneinfo.ZoneInfo(key='America/Los_Angeles'))

zoneinfo从操作系统或第三方PyPI包tzdata (如果可用)获取其时区数据库。

票数 123
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4530069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档