2016-11-22 77 views
2

我試圖將tzinfo應用於日期時間對象。Python日期時間和tzinfo對象(改變分鐘而不是幾小時)

In [1]: from datetime import datetime 
In [2]: import pytz 

In [3]: london = pytz.timezone("Europe/London") 
In [4]: london 
Out[5]: <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD> 

In [6]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, london) 
In [7]: localized_date_object 
Out[8]: datetime.datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=<DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>) 

In [9]: utc_date_object = localized_date_object.astimezone(pytz.utc) 
In [10]: utc_date_object 
Out[11]: datetime.datetime(2016, 1, 1, 11, 31, 0, 5000, tzinfo=<UTC>) 

In [16]: paris = pytz.timezone("Europe/Paris") 
In [17]: localized_date_object = datetime(2016, 1, 1, 11, 30, 0, 5000, paris) 
In [18]: utc_date_object = localized_date_object.astimezone(pytz.utc) 
In [19]: utc_date_object 
Out[19]: datetime.datetime(2016, 1, 1, 11, 21, 0, 5000, tzinfo=<UTC>) 

正如您所看到的,它將增量應用於分鐘而不是小時。
有人可以解釋我在這裏做錯了嗎?

回答

1

我認爲你應該在巴黎時間和UTC時間使用倫敦時間的CET。 我使用的是有點不同的方法,但它爲我工作:

from datetime import datetime 
from pytz import timezone 

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000) 
ldo = ldo.replace(tzinfo=timezone('Europe/London')) 

udo = ldo.astimezone(timezone('UTC')) 
print ldo 
print udo 

ldo = datetime(2016, 1, 1, 11, 30, 0, 5000) 
ldo = ldo.replace(tzinfo=timezone('CET')) 

udo = ldo.astimezone(timezone('UTC')) 
print ldo 
print udo 

UPDATE:

當存儲時間值應該可以同時存儲相關的時區信息。 IMO的最佳做法是以UTC格式存儲所有內容,並將其轉換爲「用戶」時區。從UTC歐洲BTW轉換/巴黎完美的作品,試試這個:

winter = datetime(2016, 1, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC")) 
paris = winter.astimezone(timezone("Europe/Paris")) 
print paris 
# 2016-01-01 12:30:00.005000+01:00 

summer = datetime(2016, 6, 1, 11, 30, 0, 5000, tzinfo=timezone("UTC")) 
paris = summer.astimezone(timezone("Europe/Paris")) 
print paris 
# 2016-06-01 13:30:00.005000+02:00 
+0

謝謝你吉日。所以對於倫敦來說,冬天是UTC,夏天是BST。 – Sebabouche

+0

夏季法國的CEST;) – Sebabouche

+1

@Sebabouche這不是爲您的城市確定正確時區的問題;-)當您在某處存儲時間時,還應該存儲相關時區信息(CET或CEST)。 IMO的最佳做法是以UTC格式存儲所有內容,並將其轉換爲「用戶」時區。從UTC到歐洲/巴黎的BTW轉換完美無缺,請參閱更新答案。 – Jiri

0

在第5行顯示一個奇怪的輸出 - <DstTzInfo 'Europe/London' LMT-1 day, 23:59:00 STD>這似乎是一分鐘的班次(減1天+ 23:59:00小時)。

我建議您嘗試pytz中的其他幾個時區定義來查看它們的聲明。

0

時區歐洲/倫敦在UTC 1分鐘後。時區歐洲/巴黎在UTC之前9分鐘。倫敦和巴黎在地理上接近格林威治,所以時區偏移很小。

如果您嘗試

pytz.timezone("Asia/Shanghai") 

,你會看到小時的變化。

+0

好了,所以我不希望在正確的地方,我一直在尋找傳統的時區轉換,+ 1H,-1H,像英國夏令時(BST)。但我標記你的答案是正確的;) – Sebabouche

相關問題