将日期时间打印为 pytz.timezone("Etc/GMT-5") 会产生不正确的结果

Ste*_*mer 2 python datetime pytz

考虑以下示例,其中我采用了一个天真的日期时间,使其在 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}')
Run Code Online (Sandbox Code Playgroud)

这个的输出是:

UTC  : 2019-03-07 07:45:00+00:00
UTC-5: 2019-03-07 12:45:00+05:00
Run Code Online (Sandbox Code Playgroud)

我原以为UTC-5时间是02:45,但是 5 小时的偏移量被添加到 UTC,而不是减去。

问题:

  • 为什么'Etc/GMT-5'偏移适用于 UTC +5 小时而不是 -5 小时?
  • 我怎样才能从 转换UTCUTC-5

unu*_*tbu 9

您正在使用pytz,而不仅仅是 Python 的datetime. 与 dateutil 一样,pytz使用 Olson tz 数据库

Olson tz 数据库定义了符合 POSIX 风格的Etc/GMT+N时区:

那些以“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
Run Code Online (Sandbox Code Playgroud)