2009-07-03 62 views
5

我有一個在IS8601格式utc時間戳,並試圖將其轉換爲unix時間。這是我的控制檯會話:轉換爲Unix時如何指定時區(UTC)? (Python)

In [9]: mydate 
Out[9]: '2009-07-17T01:21:00.000Z' 
In [10]: parseddate = iso8601.parse_date(mydate) 

In [14]: ti = time.mktime(parseddate.timetuple()) 

In [25]: datetime.datetime.utcfromtimestamp(ti) 
Out[25]: datetime.datetime(2009, 7, 17, 7, 21) 
In [26]: datetime.datetime.fromtimestamp(ti) 
Out[26]: datetime.datetime(2009, 7, 17, 2, 21) 

In [27]: ti 
Out[27]: 1247815260.0 
In [28]: parseddate 
Out[28]: datetime.datetime(2009, 7, 17, 1, 21, tzinfo=<iso8601.iso8601.Utc object at 0x01D74C70>) 

正如你看到的,我不能得到正確的時間回來。如果我使用timestamp(),並且如果我使用utcfromtimestamp(),則提前六個小時的時間會比一個小時快一小時

有什麼建議嗎?

謝謝!

回答

13

您可以datetime.utctimetuple()創建UTC的struct_time,然後將其轉換爲一個Unix時間戳和calendar.timegm()

calendar.timegm(parseddate.utctimetuple()) 

這也需要的任何日光節約時間偏移小心,因爲utctimetuple()規範化此。

+0

`timegm()`返回整數。它忽略了小數秒。 – jfs 2012-11-16 19:51:31

0

我只是猜測,但一個小時的差異可能不是因爲時區,而是因爲夏時制開/關。

0
naive_utc_dt = parseddate.replace(tzinfo=None) 
timestamp = (naive_utc_dt - datetime(1970, 1, 1)).total_seconds() 
# -> 1247793660.0 

another answer to similar question中查看更多詳細信息。

再換:秒

utc_dt = datetime.utcfromtimestamp(timestamp) 
# -> datetime.datetime(2009, 7, 17, 1, 21) 
0
import time 
import datetime 
import calendar 

def date_time_to_utc_epoch(dt_utc):   #convert from utc date time object (yyyy-mm-dd hh:mm:ss) to UTC epoch 
    frmt="%Y-%m-%d %H:%M:%S" 
    dtst=dt_utc.strftime(frmt)    #convert datetime object to string 
    time_struct = time.strptime(dtst, frmt) #convert time (yyyy-mm-dd hh:mm:ss) to time tuple 
    epoch_utc=calendar.timegm(time_struct) #convert time to to epoch 
    return epoch_utc 

#----test function -------- 
now_datetime_utc = int(date_time_to_utc_epoch(datetime.datetime.utcnow())) 
now_time_utc = int(time.time()) 

print (now_datetime_utc) 
print (now_time_utc) 

if now_datetime_utc == now_time_utc : 
    print ("Passed") 
else : 
    print("Failed")