2012-04-09 43 views
4

請注意以下幾點:Python:關於美國/太平洋和美洲/洛杉磯時區的datetime.astimezone的奇怪行爲?

C:\dev\poc\SDR>python 
Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from pytz import timezone 
>>> from datetime import datetime 
>>> tz1=timezone('America/Los_Angeles') 
>>> tz2=timezone('US/Pacific') 
>>> ts1=datetime(2011,8,1,tzinfo=tz1) 
>>> ts2=datetime(2011,8,1,tzinfo=tz2) 
>>> ts1 
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>) 
>>> ts2 
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 
>>> ts1.astimezone(tz1) 
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>) 
>>> ts2.astimezone(tz2) 
datetime.datetime(2011, 8, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 
>>> ts1.astimezone(tz2) 
datetime.datetime(2011, 8, 1, 1, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>) 
>>> ts2.astimezone(tz1) 
datetime.datetime(2011, 8, 1, 1, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PDT-1 day, 17:00:00 DST>) 
>>> 

這是我不明白。美國/太平洋(tz1)和美國/洛杉磯(tz2)應該表示同一時區,不是嗎?那麼如何調用datetime.astimezone從一個區域移動到另一個區域?

謝謝。

回答

4

夏令時。請注意,最後兩項是列表PDT-1

astimezone考慮到了DST,但只有在它實際完成其邏輯時纔會考慮。

前兩個astimezone在你的榜樣調用不經過充分的邏輯,因爲它們短路(因爲時區他們轉換「到」已經匹配他們是「從」轉換一個)。

(您可能,爲什麼最初的日期時間不使用PDT已經不知道這是因爲datetime構造doesn't take into account daylight savings time,即使你傳遞一個時區 - 它只是設置時區盲目。)

+0

如果你看一下打印,你也可以看到16:00:00 STD和17:00:00 DST。 – Zanson 2012-04-09 23:40:18

+0

謝謝。您如何建議在給定天真時間值和時區的情況下構建日期時間對象? – mark 2012-04-10 05:55:41

+1

@mark - 如鏈接頁面中提到的,要將樸素的'datetime'轉換爲本地化的,使用時區對象的'.localize()'方法。 (基本上,在不傳遞'tzinfo'的情況下構造'datetime'對象,然後使用'pytz'中的時區對象來定位它。) – Amber 2012-04-10 06:08:24

相關問題