2012-07-04 152 views
1

有沒有辦法讓UTC與給定時區之間出現不同的小時數?獲取UTC與給定時區的小時差與Python

例如,UTC與歐洲/阿姆斯特丹的區別是+2小時。

有沒有在這方面的蟒蛇?

+0

也許這可能是有用的:http://stackoverflow.com/questions/6528391/python-how-to-get-utc-time-given-timezone – mmot

+1

你試過[pytz](http:// pytz。 sourceforge.net/) – Rohan

+0

@MariaZverina我有一個日期時間對象,它目前採用UTC + 2格式(歐洲/阿姆斯特丹)。我必須將其轉換回UTC。如果我能得到「歐洲/阿姆斯特丹」和UTC之間的時差,那很容易:-2。然後我可以做一些事情:mydate = nlDate - timedelte(hours = 2)。我只是不知道如何獲得兩個時區之間的差異。 – w00

回答

4

比方說,你有時區日期時間:

import datetime 
import pytz 

d = datetime.datetime(2012, 1, 1, 0, 0, 0, tzinfo=pytz.utc) 
In [54]: d 
Out[54]: datetime.datetime(2012, 1, 1, 0, 0, tzinfo=<UTC>) 

將其轉換爲阿姆斯特丹時間,使用:

ams = pytz.timezone('Europe/Amsterdam') 

In [55]: d.astimezone(ams) 
Out[55]: datetime.datetime(2012, 1, 1, 1, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' CET+1:00:00 STD>) 

pst = timezone('US/Pacific') 
In [118]: d.astimezone(pst) 
Out[118]: datetime.datetime(2011, 12, 31, 16, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 

如果我們有沒有時區(天真的日期時間)日期時間,我們可以將其轉換爲:

dd = datetime.datetime(2012, 2, 2, 0, 0) 
ams.localize(naive_dt).astimezone(pst) # set it as 'ams' first, then convert to pst 
Out[131]: datetime.datetime(2012, 2, 1, 15, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:00 STD>) 

要查看兩個時區之間的差異:

In [137]: ams.utcoffset(datetime.datetime(2012,1,1)) 
Out[137]: datetime.timedelta(0, 3600) 

In [138]: pst.utcoffset(datetime.datetime(2012,1,1)) 
Out[138]: datetime.timedelta(-1, 57600) 

所以AMS根據UTC + 1H,和PST是-8(-1天和+ 16H)

編輯:如在docs解釋的,這樣的:

datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam) 

不管用。

+0

你應該提到夏令時。 –

+0

除非您提供is_dst kwarg參數,否則pytz的utcoffset將在大多數DST時區中每年一小時拋出AmbiguousTimeError。見http://pytz.sourceforge.net/#tzinfo-api我會避開它。 –