2009-07-03 7 views
5

J'ai un horodatage utc au format IS8601 et j'essaie de le convertir en temps unix. Ceci est ma session de console:Comment spécifier le fuseau horaire (UTC) lors de la conversion en heure Unix? (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>) 

Comme vous pouvez le voir, je ne peux pas obtenir l'heure correcte. L'heure est devant par un si j'utilise fromtimestamp(), et il est en avance de six heures si j'utilise utcfromtimestamp()

Un conseil?

Merci!

Répondre

13

Vous pouvez créer un struct_time en UTC avec datetime.utctimetuple() puis convertir en un timestamp unix avec calendar.timegm():

calendar.timegm(parseddate.utctimetuple()) 

Cela prend également soin de tout temps de l'heure d'été offset, car utctimetuple() normalise cela.

+0

'timegm() nombre de secondes' de retour entier. Il ignore les fractions de seconde. – jfs

0

Je ne fais que deviner, mais une heure de différence peut ne pas être due au fuseau horaire, mais à l'heure d'été.

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

Voir plus de détails dans another answer to similar question.

Et de retour:

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") 
Questions connexes