Python pytz 时区转换返回的值与不同日期的时区偏移量不同

Posted

技术标签:

【中文标题】Python pytz 时区转换返回的值与不同日期的时区偏移量不同【英文标题】:Python pytz timezone conversion returns values that differ from timezone offset for different dates 【发布时间】:2017-04-24 16:16:09 【问题描述】:

我试图将美国/东部时区日期转换为 UTC,以上传到仅接受 UTC 时间但以本地时区显示时间的网站。我有以下代码示例,当我转换最近的日期时,偏移量(5:00 或 4:00)没有问题,但是当我转换诸如 1900-01-01 之类的日期时,偏移量变成了大约4:56 等

import pytz
import tzlocal
from datetime import datetime
usest=tzlocal.get_localzone()#My local zone is US/Eastern. I could directly use that here as pytz.timezone("US/Eastern")
dt=datetime(1900,1,1,0,0,0)
dt_aware=usest.localize(dt,is_dst=True)
utcdate=dt_aware.astimezone(pytz.utc)
print (utcdate)
1900-01-01 04:56:00+00:00

dt1=datetime(2016,1,1,0,0,0)
dt1_aware=usest.localize(dt1,is_dst=True)
utcdate1=dt1_aware.astimezone(pytz.utc)
print (utcdate1)
2016-01-01 05:00:00+00:00

如果是第一次约会,我也期待 1900-01-01 05:00:00+00:00。为什么会这样?这是正确的吗?

请务必注意,当我将 UTC 时间“1900-01-01 04:56:00+00:00”转换回美国/东部时间时,它又转换回“1900-01-01 00: 00:00”。所以,几分钟的差距,背后一定有一定的逻辑。

我在 Wikipedia 站点“https://en.wikipedia.org/wiki/Tz_database”的“示例区域和规则行”部分下找到了这个

区域名称 GMTOFF 规则格式 [UNTIL]

Zone America/New_York -4:56:02 - LMT 1883 Nov 18 12:03:58

我不一定明白他们在说什么,但我看到那里的偏移量是 4:56。我觉得我离答案更近了,但需要一些帮助。

更新:我在我的 Mac book pro 上尝试了 zdump,得到了 1901 年的输出。无法,获取之前几年的详细信息。我研究了 tz 数据库中提供的详细信息,但找不到明确的答案。出于我当前项目的目的,我使用了一个替代区域转换器模块(钟摆),它不会试图真实地反映历史,而是遵循解决了我的问题的当前夏令时周期。但是,问题仍然存在。为什么在东部时区和 UTC 之间转换 1900 年之前的日期时,时间偏移不同于 5:00/4:00 小时?

【问题讨论】:

【参考方案1】:

假设您使用的是 Linux 或 BSD,如果您运行“zdump -v US/Eastern”,您将看到完整的转换列表。直到 1918 年,美国才改用整小时偏移,可能是因为铁路或电报的需要。

US/Eastern  Sun Nov 18 16:59:59 1883 UT = Sun Nov 18 12:03:57 1883 LMT isdst=0 gmtoff=-17762
US/Eastern  Sun Nov 18 17:00:00 1883 UT = Sun Nov 18 12:00:00 1883 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 31 06:59:59 1918 UT = Sun Mar 31 01:59:59 1918 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 31 07:00:00 1918 UT = Sun Mar 31 03:00:00 1918 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Oct 27 05:59:59 1918 UT = Sun Oct 27 01:59:59 1918 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Oct 27 06:00:00 1918 UT = Sun Oct 27 01:00:00 1918 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 30 06:59:59 1919 UT = Sun Mar 30 01:59:59 1919 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 30 07:00:00 1919 UT = Sun Mar 30 03:00:00 1919 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Oct 26 05:59:59 1919 UT = Sun Oct 26 01:59:59 1919 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Oct 26 06:00:00 1919 UT = Sun Oct 26 01:00:00 1919 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 28 06:59:59 1920 UT = Sun Mar 28 01:59:59 1920 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 28 07:00:00 1920 UT = Sun Mar 28 03:00:00 1920 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Oct 31 05:59:59 1920 UT = Sun Oct 31 01:59:59 1920 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Oct 31 06:00:00 1920 UT = Sun Oct 31 01:00:00 1920 EST isdst=0 gmtoff=-18000

[...]

US/Eastern  Sun Mar  8 06:59:59 2015 UT = Sun Mar  8 01:59:59 2015 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar  8 07:00:00 2015 UT = Sun Mar  8 03:00:00 2015 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  1 05:59:59 2015 UT = Sun Nov  1 01:59:59 2015 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  1 06:00:00 2015 UT = Sun Nov  1 01:00:00 2015 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 13 06:59:59 2016 UT = Sun Mar 13 01:59:59 2016 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 13 07:00:00 2016 UT = Sun Mar 13 03:00:00 2016 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  6 05:59:59 2016 UT = Sun Nov  6 01:59:59 2016 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  6 06:00:00 2016 UT = Sun Nov  6 01:00:00 2016 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 12 06:59:59 2017 UT = Sun Mar 12 01:59:59 2017 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 12 07:00:00 2017 UT = Sun Mar 12 03:00:00 2017 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  5 05:59:59 2017 UT = Sun Nov  5 01:59:59 2017 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  5 06:00:00 2017 UT = Sun Nov  5 01:00:00 2017 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 11 06:59:59 2018 UT = Sun Mar 11 01:59:59 2018 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar 11 07:00:00 2018 UT = Sun Mar 11 03:00:00 2018 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  4 05:59:59 2018 UT = Sun Nov  4 01:59:59 2018 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  4 06:00:00 2018 UT = Sun Nov  4 01:00:00 2018 EST isdst=0 gmtoff=-18000

[...]

US/Eastern  Sun Mar  9 06:59:59 2498 UT = Sun Mar  9 01:59:59 2498 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar  9 07:00:00 2498 UT = Sun Mar  9 03:00:00 2498 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  2 05:59:59 2498 UT = Sun Nov  2 01:59:59 2498 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  2 06:00:00 2498 UT = Sun Nov  2 01:00:00 2498 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar  8 06:59:59 2499 UT = Sun Mar  8 01:59:59 2499 EST isdst=0 gmtoff=-18000
US/Eastern  Sun Mar  8 07:00:00 2499 UT = Sun Mar  8 03:00:00 2499 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  1 05:59:59 2499 UT = Sun Nov  1 01:59:59 2499 EDT isdst=1 gmtoff=-14400
US/Eastern  Sun Nov  1 06:00:00 2499 UT = Sun Nov  1 01:00:00 2499 EST isdst=0 gmtoff=-18000

【讨论】:

我在一台 Windows 机器上。但是,我会尝试启动一个 linux 环境并在一两天内进行测试。 我可以在 python 中使用 pytz 模块在不使用 unix 环境的情况下获取相同的信息吗? 您可以从 pytz 获得相同的信息,但这只是让 pytz 同意自己:) 生成这样一个表所需的信息也不容易获得。没有 API 可以以友好的方式访问转换时间。 太棒了!谢谢@stub。根据您帖子中的信息,我看到以下内容。 同年gmtoff相差一分钟,gmtoff相差很大。同时我看到 isdst=0,我假设当时没有 dst。我还在想,如果到 1883 年 11 月 18 日星期日 17:00:00 之前,gmtoff 是否与现在相似,为什么 pytz 显示 1900 年的结果与 1883 年 11 月 18 日星期日 16:59:59 的时间相似。可能这是 Pytz 中的一个错误吗?有没有办法获得 1990 年的 gmtoff?

以上是关于Python pytz 时区转换返回的值与不同日期的时区偏移量不同的主要内容,如果未能解决你的问题,请参考以下文章

python 使用`pytz`将时间和日期对话转换为其他时区。

使用 pytz 进行日期时间和时区转换 - 令人兴奋的行为

python不正确的时区转换使用pytz

使用pytz的python时区转换问题

在 Python 中使用 pytz 本地化纪元时间

使用 pytz 时区时 Python 日期时间不包括 DST