【问题标题】:Printing datetime as pytz.timezone("Etc/GMT-5") yields incorrect result将日期时间打印为 pytz.timezone("Etc/GMT-5") 会产生不正确的结果
【发布时间】:2019-07-17 10:58:32
【问题描述】:

考虑以下示例,我采用了一个简单的日期时间,使其在 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


【解决方案1】:

显然,在 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

【讨论】:

  • 您已链接到 dateutil,而我使用的是 datetime。您是否有解释此行为的日期时间文档的链接?
  • 我看不到专门针对日期时间的文档。如果我看到,我会发布。然而,这个 posix 的东西并不是 dateutil 特有的。
【解决方案2】:

您使用的是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

【讨论】:

  • 感谢您的支持 - 现在我的脑海里肯定已经清楚了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2018-12-05
  • 2022-01-12
相关资源
最近更新 更多