2016-12-09 42 views
1

我试图将美国/东部时区日期转换为UTC以上传到只接受UTC时间的网站,但在本地时区显示时间。我有以下代码示例,其中当我转换最近的日期时,偏移量(5:00或4:00)没有问题,但是当我转换日期(如1900-01-01)时,偏移量变成了4:56等Python pytz时区转换返回不同日期的时区偏移值

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-0100 :00:00" 。所以,几分钟的差别必须有一些逻辑背后的逻辑。

我节下发现这个维基百科网站 “https://en.wikipedia.org/wiki/Tz_database”, “实施例区和规则线”

区域名称GMTOFF规则FORMAT [UNTIL]

区美国/纽约-4:56:02 - LMT 1883 Nov 18 12:03:58

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

更新:我在我的Mac book pro上试过了zdump,并从1901年获得了输出结果。无法获得多年前的详细信息。我研究了tz数据库中提供的细节,但找不到明确的答案。对于我目前的项目来说,我使用了另一个区域转换器模块(钟摆),它不会试图忠实于历史记录,但会遵循当前的夏令时周期来解决我的问题。但是,问题依然存在。为什么在1900年之前转换东部时区和UTC之间的日期时,会出现与5:00/4:00小时不同的时间偏移?

回答

0

假设您在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 
+0

我在一台Windows机器上。但是,我会尝试启动一个Linux环境并在一两天内测试。 – Raj006

+0

我可以在python中使用pytz模块来获取相同的信息而不使用unix环境。 – Raj006

+0

你可以从pytz中得到相同的信息,但这只是让pytz同意自己:)生成这样的表所需的信息也不容易访问。没有API以友好的方式访问转换时间。 – stub

相关问题