自 Python 3.9 起,您可以使用
zoneinfo
模块。
首先让我们使用
utcnow()
获取该时间:
>>> from datetime import datetime
>>> database_time = datetime.utcnow()
>>> database_time
datetime.datetime(2021, 9, 24, 4, 18, 27, 706532)
然后创建时区:
>>> from zoneinfo import ZoneInfo
>>> utc = ZoneInfo('UTC')
>>> localtz = ZoneInfo('localtime')
然后进行转换。为了在不同时区之间进行转换,必须知道日期时间所在的时区,然后使用astimezone()
函数即可:
>>> utctime = database_time.replace(tzinfo=utc)
>>> localtime = utctime.astimezone(localtz)
>>> localtime
datetime.datetime(2021, 9, 24, 6, 18, 27, 706532, tzinfo=zoneinfo.ZoneInfo(key='localtime'))
对于Python 3.6到3.8,您需要使用backports.zoneinfo模块:
>>> try:
>>> from zoneinfo import ZoneInfo
>>> except ImportError:
>>> from backports.zoneinfo import ZoneInfo
其余部分相同。
对于早于该版本的版本,需要使用pytz
或dateutil
。 dateutil 的工作方式类似于 zoneinfo:
>>> from dateutil import tz
>>> utc = tz.gettz('UTC')
>>> localtz = tz.tzlocal()
The Conversion:
>>> utctime = now.replace(tzinfo=UTC)
>>> localtime = utctime.astimezone(localtz)
>>> localtime
datetime.datetime(2010, 12, 30, 15, 51, 22, 114668, tzinfo=tzlocal())
pytz
有一个不同的接口,这是由于 Python 的时区处理不处理模糊时间所导致的:
>>> import pytz
>>> utc = pytz.timezone('UTC')
>>> localtz = pytz.timezone('Europe/Paris')
>>> utctime = utc.localize(database_time)
>>> localtime = localtz.normalize(utctime.astimezone(localtz))
>>> localtime
pytz
的情况下找不到答案。感觉很傻。 - Kuo