2012-02-16 55 views
1

我有以下時間:20111122050940.086000,我想轉換到秒,所以我用下面的代碼:Python的時區轉換

def get_precision_datenum(self, datestring): 
     ymdhms, usec = datestring.split('.') 

     timestamp = datetime.datetime.strptime(ymdhms, "%Y%m%d%H%M%S")   
     datenum = mktime(timestamp.timetuple()) + float(usec)/1000000 
     print datenum; 
     return "%10.3f" % datenum 

當我轉換回,從幾秒鐘到timetuple然後一小時的時間少於一小時。示例代替2011-11-22 05:09:40,我得到2011-11-22 04:09:40

我在哪裏犯了錯誤?

+0

在'.'後面總是有6位數字嗎?如果不是,下面可能會更好:'datenum = mktime(timestamp.timetuple())+ float(「。」+ usec)' – glglgl 2012-02-16 14:21:18

回答

4

如果您datestring是UTC:

from datetime import datetime 
import calendar 
import pytz 

datestring = '20111122050940.086000' 
ymdhms, usec = datestring.split('.') 

dt = pytz.utc.localize(datetime.strptime(ymdhms, '%Y%m%d%H%M%S')) 
calendar.timegm(dt.utctimetuple()) + float(usec)/1000000. 

打印1321938580.086(獨立於系統時區)

要打印爲UTC:

dt_utc = pytz.utc.localize(datetime.utcfromtimestamp(1321938580.086)) 

# datetime.datetime(2011, 11, 22, 5, 9, 40, 86000, tzinfo=<UTC>) 

dt_utc.strftime('%Y%m%d%H%M%S.%f') 

# '20111122050940.086000' 

,如果你是在一個不同的時區,您必須先將其轉換爲:

dt_hu = dt_utc.astimezone(pytz.timezone('Europe/Budapest')) 

# datetime.datetime(2011, 11, 22, 6, 9, 40, 86000, tzinfo=<DstTzInfo 'Europe/Budapest' CET+1:00:00 STD>) 

,然後打印:

dt_hu.strftime('%Y%m%d%H%M%S.%f') 

# '20111122060940.086000' 

這個獨立的系統時區太工作。

+0

是UTC還是我的時區是CET – 2012-02-16 13:47:31

+0

@KicsiMano - 好的,這裏更新的版本 – eumiro 2012-02-16 14:02:33

+0

爲了查找Python時區轉換,我使用Taavi Burns的PyCon 2012演示文稿中的便捷表格。 http://taaviburns.ca/presentations/what_you_need_to_know_about_datetimes/ http://pyvideo.org/video/946/what-you-need-to-know-about-datetimes – akaihola 2012-10-26 09:46:16