2016-12-09 41 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

相關問題