请考虑以下示例,在该示例中,我采用了一个简单的日期时间,在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
?答案 0 :(得分:3)
您正在使用pytz
,而不仅仅是Python的datetime
。
Like dateutil,pytz uses the Olson tz database。
Olson tz数据库定义了conform with the POSIX style的Etc/GMT+N
时区:
这些区域名称以 “ Etc / GMT”的符号与标准ISO 8601约定相反。在 “ Etc”区域,格林尼治标准时间(GMT)以西的区域具有正号,而东部的区域具有一个正号。 名称中带有负号(例如,“ 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
答案 1 :(得分:0)
显然,在posix样式系统中,必须使用时区偏移量的倒数。这意味着如果要获取-5
,则必须使用GMT+5
。
d3 = d2.astimezone(pytz.timezone('Etc/GMT+5'))
打印
UTC-5: 2019-03-07 02:45:00-05:00
否则,您必须将posix_offset
传递为true。这在dateutil文档中;
有一个值得注意的例外,那就是POSIX风格的时区 使用反向偏移格式,因此通常将GMT + 3解析为 与格林尼治标准时间相比落后3小时。 tzstr时区对象将对此进行解析 比格林尼治标准时间早3小时。如果您想维持 POSIX行为,将True值传递给posix_offset。
https://dateutil.readthedocs.io/en/stable/tz.html#dateutil.tz.tzstr