我正在尝试从datetime.datetime.today()的值中减去一个日期值,以计算某事发生在多长时间之前。但它抱怨道:
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?
当然,理想的解决方案是让它自动知道时区。
发布于 2010-12-25 19:44:34
在标准库中,如果不创建自己的时区类,就没有跨平台的方法来创建可识别的时区。(编辑:Python3.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的原因:
发布于 2013-05-21 08:50:35
获取特定时区的当前时间:
import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))记住要先安装pytz。
发布于 2016-08-26 22:36:19
在Python 3.2+中:datetime.timezone.utc
标准库使得将UTC指定为时区变得更加容易:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2020, 11, 27, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)还可以使用astimezone获取包含本地时间偏移量的datetime
>>> 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指定特定的时区,如下所示:
>>> 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 (如果可用)获取其时区数据库。
https://stackoverflow.com/questions/4530069
复制相似问题