2012-11-12 18 views
8

我有一個數據庫存儲日期時間爲UTC。我需要查詢特定時間的信息,但日期和時間是在當地時間給出的,比如說'歐洲/哥本哈根'。我給了這些爲:python pytz:將本地時間轉換爲utc。本地化似乎並沒有轉換

year = 2012; month = 12; day = 2; hour = 13; min = 1; 

所以,我需要把這些轉化爲UTC,所以我可以看看他們在數據庫中。我想用pytz來做到這一點。我在看localize

local_tz = timezone('Europe/Copenhagen') 
t = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 

但我感到困惑localize()。這是假設那年,等等,是在當地時間給我的?或者,它是否假定它們是以UTC給出的,現在它已將它們轉換爲當地時間?

print t給我:

2012-12-02 13:01:00+01:00 

如此看來,它假定原來的一年,等在UTC;小時現在是13 + 1而不是13。所以我應該怎麼做呢?我已經閱讀了pytz文檔,這並沒有讓我更清楚。它提到很多事情是棘手的,所以我不確定pytz是否真的解決了這些問題。而且,我並不總是知道這些例子是向我展示一些工作還是一些不起作用的東西。

我試圖正常化:

print local_tz.normalize(t) 

這給了我同樣的結果打印噸。

編輯:用上面給出的年份等數字,它應該匹配2012-12-2 12:01數據庫中的信息。 (因爲哥本哈根UTC + 1在該日期)

回答

16

localize()附着的時區到幼稚datetime.datetime實例在本地時區。

如果在本地時區有日期時間值,定位到該時區,然後使用.astimezone()的值轉換爲UTC:

>>> localdt = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 
>>> localdt.astimezone(pytz.UTC) 
datetime.datetime(2012, 12, 2, 12, 1, tzinfo=<UTC>) 

請注意,你不需要要做到這一點,datetime可以比較對象與時區;他們倆都被標準化爲UTC的測試:

>>> localdt.astimezone(pytz.UTC) == localdt 
True 
+0

給出的時間爲14:01:00 + 01:00。正確的本地時間是13,utc時間是12. – user984003

+0

@ user984003:啊,對不起,誤讀了第一句。 '.astimezone()'仍然是要走的路,只是相反。 –

+0

是的,第二種方法可行,謝謝。你可以在你的答案中有這個,否則我覺得有點混亂;)我看到我對打印日期感到困惑。 「+01:00」告訴我,它比utc早一個小時,而不是我應該增加一個小時。 – user984003

0

如果你知道傳入的時間表示在Europe/Copenhagen時區,你可以創建它作爲時區感知開始說起:

local_tz = timezone('Europe/Copenhagen') 
t = local_tz.localize(datetime.datetime(year, month, day, hour, min)) 

然後,您可以「轉換」這UTC有:

t_utc = t.astimezone(pytz.UTC) 

但是這可能不是必要的,這取決於你的數據庫驅動程序如何理智的。 tt_utc代表相同的時間點而行爲良好的代碼應該交替處理它們。這個元組只是這個時間點和日曆系統中這個時間點的人類可讀表示。