将日期时间打印为pytz.timezone(“Etc / GMT-5”)会产生错误的结果

问题描述 投票:1回答:2

考虑以下示例,其中我采用天真的日期时间,使其以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
python datetime pytz
2个回答
3
投票

你正在使用pytz,而不仅仅是Python的datetimeLike 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

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为真。这是在dateutil文档中;

有一个值得注意的例外,即POSIX风格的时区使用反向偏移格式,因此通常GMT + 3将被解析为比GMT低3小时的偏移量。 tzstr时区对象将在GMT之前3小时将其解析为偏移量。如果要保持POSIX行为,请将True值传递给posix_offset。

https://dateutil.readthedocs.io/en/stable/tz.html#dateutil.tz.tzstr

© www.soinside.com 2019 - 2024. All rights reserved.