¿Cómo especificar la zona horaria (UTC) al convertir a la hora de Unix? (Pitón)

Tengo una marca de tiempo utc en el formato IS8601 y estoy tratando de convertirlo a tiempo de Unix. Esta es mi sesión de consola:

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=) 

Como puedes ver, no puedo recuperar el tiempo correcto. La hora está adelantada en uno si uso fromtimestamp (), y está adelantada en seis horas si uso utcfromtimestamp ()

¿Algún consejo?

¡Gracias!

Puede crear un struct_time en UTC con datetime.utctimetuple() y luego convertirlo en una marca de tiempo de Unix con calendar.timegm() :

 calendar.timegm(parseddate.utctimetuple()) 

Esto también se ocupa de cualquier compensación de horario de verano, porque utctimetuple() normaliza esto.

Solo estoy adivinando, pero la diferencia de una hora no puede ser por zonas horarias, sino por el horario de verano activado / desactivado.

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

Ver más detalles en otra respuesta a una pregunta similar .

Y de vuelta

 utc_dt = datetime.utcfromtimestamp(timestamp) # -> datetime.datetime(2009, 7, 17, 1, 21) 
 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")