Eu tenho dt = datetime(2013,9,1,11)
, e eu gostaria de obter um carimbo de data/hora Unix deste objeto de data.
Quando eu faço (dt - datetime(1970,1,1)).total_seconds()
Eu tenho o timestamp 1378033200
.
Ao convertê-lo de volta utilizando datetime.fromtimestamp
eu tenho datetime.datetime(2013, 9, 1, 6, 0)
.
A hora não't coincide. O que é que eu perdi aqui?
O que você perdeu aqui são os fusos horários.
Presumivelmente você've cinco horas fora do UTC, portanto 2013-09-01T11:00:00 local e 2013-09-01T06:00:00Z são a mesma hora.
Você precisa ler o topo dos documentos datetime
, que explicam sobre fusos horários e "naive" e "aware" objetos.
Se a sua data original ingénua era UTC, a forma de a recuperar é utilizar o utcfromtimestamp' em vez do `fromtimestamp'.
Por outro lado, se a sua data original ingênua era local, você não deveria ter subtraído um carimbo de tempo UTC; utilize datetime.fromtimestamp(0)
em vez disso.
Ou, se você tinha um objeto de data/hora consciente, você precisa ou usar uma época local (consciente) de ambos os lados, ou explicitamente converter para e de UTC.
Se você tem, ou pode atualizar para o Python 3.3 ou posterior, você pode evitar todos esses problemas utilizando apenas o método timestamp
ao invés de tentar descobrir como fazê-lo você mesmo. E mesmo se você não't, você pode querer considerar pegar emprestado seu código fonte.
(E se você puder esperar pelo Python 3.4, parece que o PEP 341 provavelmente chegará ao lançamento final, o que significa que todas as coisas de que J.F. Sebastian e eu estávamos falando nos comentários devem poder ser feitas apenas com a stdlib, e trabalhar da mesma forma tanto no Unix quanto no Windows).
Em vez desta expressão para criar um carimbo temporal POSIX a partir do dt
,
(dt - datetime(1970,1,1)).total_seconds()
Usa isto:
int(dt.strftime("%s"))
Eu recebo a resposta certa no seu exemplo usando o segundo método.
Algum seguimento... Depois de alguns comentários (veja abaixo), eu estava curioso sobre a falta de suporte ou documentação para %s' em
strftime'. Aqui's o que eu encontrei:
No Python source para datetime
e time
, a string STRFTIME_FORMAT_CODES
nos diz:
"Other codes may be available on your platform.
See documentation for the C library strftime function."
Então agora se nós man strftime
(em sistemas BSD como Mac OS X), você'vai encontrar suporte para %s
:
"%s is replaced by the number of seconds since the Epoch, UTC (see mktime(3))."
De qualquer forma, isso'é por isso que `%s' funciona nos sistemas que ele faz. Mas existem soluções melhores para o problema do OP's (que levam em conta os fusos horários). Veja @abarnert's resposta aceita aqui.
Bem, ao converter para o timestamp unix, python está basicamente assumindo UTC, mas enquanto converte de volta ele lhe dará uma data convertida para o seu timezone local.
Veja esta pergunta/resposta; https://stackoverflow.com/questions/18812638/get-timezone-used-by-datetime-datetime-fromtimestamp