考虑以下示例,其中我采用天真的日期时间,使其以UTC格式识别时区,然后转换为UTC-5:
d1 = datetime.datetime(2019,3,7, 7,45)
d2 = pytz.utc.localize(d1)
print(f'UTC : {d2}')
d3 = d2.astimezone(pytz.timezone('Etc/GMT-5'))
print(f'UTC-5: {d3}')
这个输出是:
UTC : 2019-03-07 07:45:00+00:00 UTC-5: 2019-03-07 12:45:00+05:00
我本来期望UTC-5
时间是02:45
,但是5小时偏移量被添加到UTC,而不是减去。
问题:
'Etc/GMT-5'
偏移应用于UTC +5小时而不是-5小时?UTC
转换为UTC-5
?你正在使用pytz
,而不仅仅是Python的datetime
。 Like dateutil,pytz uses the Olson tz database。
Olson tz数据库定义Etc/GMT+N
时区,conform with the POSIX style:
那些以“Etc / GMT”开头的区域名称的标志与标准的ISO 8601惯例相反。在“Etc”区域,格林威治标准时间以西的区域有一个正号,而东方区域的名称有一个负号(例如“Etc / GMT-14”比格林威治标准时间早14个小时。)
因此,要将UTC转换为偏移-5的时区,您可以使用Etc/GMT+5
:
import datetime as DT
import pytz
naive = DT.datetime(2019, 3, 7, 7, 45)
utc = pytz.utc
gmt5 = pytz.timezone('Etc/GMT+5')
print(utc.localize(naive).astimezone(gmt5))
# 2019-03-07 02:45:00-05:00
显然,在posix风格的系统中,你必须使用时区偏移的倒数。这意味着如果你想获得-5
,你必须使用GMT+5
。
d3 = d2.astimezone(pytz.timezone('Etc/GMT+5'))
版画
UTC-5: 2019-03-07 02:45:00-05:00
否则,你必须传递posix_offset
为真。这是在dateutil文档中;
有一个值得注意的例外,即POSIX风格的时区使用反向偏移格式,因此通常GMT + 3将被解析为比GMT低3小时的偏移量。 tzstr时区对象将在GMT之前3小时将其解析为偏移量。如果要保持POSIX行为,请将True值传递给posix_offset。
https://dateutil.readthedocs.io/en/stable/tz.html#dateutil.tz.tzstr