Pergunta

Eu tenho um carimbo de hora UTC no formato IS8601 e estou tentando convertê-lo para uma hora Unix. Esta é a minha sessão de console:

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

Como você pode ver, eu não posso começar a voltar no tempo correto. A hora está à frente por um se eu usar fromtimestamp (), e ele está à frente por seis horas se eu usar utcfromtimestamp ()

Qualquer conselho?

Obrigado!

Foi útil?

Solução

Você pode criar um struct_time em UTC com datetime.utctimetuple() em seguida, converter isso em um timestamp unix com calendar.timegm() :

calendar.timegm(parseddate.utctimetuple())

Este também cuida de qualquer horário de verão compensar tempo, porque utctimetuple() normaliza isso.

Outras dicas

Eu estou apenas supondo, mas uma hora de diferença pode ser não por causa dos fusos horários, mas por causa do horário de verão on / off.

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

Veja mais detalhes na outra resposta para semelhante pergunta .

E de volta:

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")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top