带时区的Python datetime.now()



我有一个浮动时区(例如4.0)。
我想用给定的时区构造datetime

我试过了,

datetime.now(timezone)

但是会抛出

TypeError: tzinfo argument must be None or of a tzinfo subclass, not type 'float'

所以我想知道我如何使tzinfo从浮动?

如果你使用Python 3.2或更新版本,你需要创建一个datetime.timezone()对象;它接受一个偏移量作为datetime.timedelta():

from datetime import datetime, timezone, timedelta
timezone_offset = -8.0  # Pacific Standard Time (UTC−08:00)
tzinfo = timezone(timedelta(hours=timezone_offset))
datetime.now(tzinfo)

对于早期的Python版本,使用外部库为您定义时区对象将是最简单的。

dateutil库包含了用于获取数值偏移量来创建时区对象的对象:

from dateutil.tz import tzoffset
timezone_offset = -8.0  # Pacific Standard Time (UTC−08:00)
tzinfo = tzoffset(None, timezone_offset * 3600)  # offset in seconds
datetime.now(tzinfo)

我建议您使用pytz,因为它可能更简单。

根据描述:

此库允许使用Python 2.4或更高版本进行准确和跨平台的时区计算。它还解决了夏令时结束时时间不明确的问题,您可以在Python库参考

中了解更多信息。
>>> from datetime import datetime
>>> import pytz
>>> datetime.now(tz=pytz.UTC)
datetime.datetime(2021, 11, 12, 20, 59, 54, 579812, tzinfo=<UTC>)
>>> datetime.now(tz=pytz.timezone("Europe/Oslo"))
datetime.datetime(2021, 11, 12, 22, 0, 4, 911480, tzinfo=<DstTzInfo 'Europe/Oslo' CET+1:00:00 STD>)
>>> [tz for tz in pytz.common_timezones if tz.startswith("US")]
['US/Alaska',
 'US/Arizona',
 'US/Central',
 'US/Eastern',
 'US/Hawaii',
 'US/Mountain',
 'US/Pacific']
 

使用Python 3.9的zoneinfo标准库的一行代码:

>>> from zoneinfo import ZoneInfo
>>> datetime.now(ZoneInfo('US/Pacific'))
datetime.datetime(2022, 8, 15, 21, 59, 10, 422603, tzinfo=zoneinfo.ZoneInfo(key='US/Pacific'))

从Python 3.6开始,您可以在datetime对象上使用astimezone方法来基于用户的区域设置获得具有时区意识的datetime对象:

>>> from datetime import datetime
>>> datetime.now().astimezone().isoformat()
'2023-05-25T17:52:38.524753-07:00'

Python 3.9将IANA tz数据库支持(类似pytz)作为zoneinfo.

建议使用IANA名称,而不是由于夏令时而使用静态UTC偏移量。

相关内容

  • 没有找到相关文章

最新更新