首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将日期时间打印为pytz.timezone("Etc/GMT-5")会产生不正确的结果

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

Stack Overflow用户
提问于 2019-02-23 14:12:38
回答 2查看 1.8K关注 0票数 2

考虑下面的示例,其中我取了一个天真的日期时间,让它在UTC中知道时区,然后转换为UTC-5:

代码语言:javascript
复制
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}')

这方面的产出如下:

世界协调时间: 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-23 14:50:59

您使用的是pytz,而不仅仅是Python的datetime像dateutil,pytz 使用Olson tz数据库.

Olson数据库定义了Etc/GMT+N时区,其中符合POSIX风格

以"Etc/GMT“开头的区域名称与ISO 8601标准公约相反。在“等”区,格林尼治时间以西的地区有一个积极的标志,东边的地区在其名义上有一个负号(例如"Etc/ GMT - 14“比格林尼治时间提前14小时)。

因此,要将UTC转换为具有偏移量-5的时区,可以使用Etc/GMT+5

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2019-02-23 14:37:47

显然,在posix风格的系统中,您必须使用时区偏移量的逆值。这意味着如果您想获得-5,就必须使用GMT+5

代码语言:javascript
复制
d3 = d2.astimezone(pytz.timezone('Etc/GMT+5'))

版画

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54842491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档