Eu tenho um horário no UTC no qual desejo o número de segundos desde a época.
Estou usando o strftime para convertê-lo para o número de segundos. Tomando 1 de abril de 2012 como exemplo.
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
Em 1º de abril de 2012, o UTC da época é 1333238400, mas isso retorna 1333234800, que é diferente em 1 hora.
Parece que o strftime está levando em consideração o horário do meu sistema e aplica uma mudança de fuso horário em algum lugar. Eu pensei que o horário era puramente ingênuo?
Como posso contornar isso? Se possível, evite importar outras bibliotecas, a menos que seja padrão. (Tenho preocupações de portabilidade).
datetime.datetime.timestamp(datetime.datetime.utcnow())
Respostas:
Se você deseja converter um datetime de python em segundos desde a época, você pode fazê-lo explicitamente:
No Python 3.3 ou superior, você pode usar
timestamp()
:Por que você não deve usar
datetime.strftime('%s')
Na verdade, o Python não suporta% s como argumento para strftime (se você verificar em http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior não está na lista), o único A razão pela qual está funcionando é porque o Python está passando as informações para o strftime do seu sistema, que usa o fuso horário local.
fonte
.strftime("%s")
: não é suportado, não é portátil, pode produzir silenciosamente um resultado errado para um objeto de data e hora consciente, falha se a entrada estiver no UTC (como na pergunta), mas o fuso horário local não for UTCAttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'
td.seconds + td.days*24*3600
. Isso descarta a parte de microssegundos.Eu tive problemas sérios com fusos horários e tal. A maneira como o Python lida com tudo o que acontece é bastante confuso (para mim). As coisas parecem estar funcionando bem usando o módulo de calendário (consulte os links 1 , 2 , 3 e 4 ).
fonte
aprilFirst
neste exemplo fosse uma instância 'consciente' e usasse um fuso horário diferente do fuso horário do sistema, o resultado não seria correto (o fuso horário é perdido natimetuple()
chamada). Para obter a resposta certa para um período de tempo "consciente", você pode usar oawaredt.timestamp()
recente Python 3. Para o Python 2, é mais difícil; Uma maneira é usar aarrow
biblioteca.arrow.get(awaredt).timestamp
vai acertar.datetime
objeto, então presumi que o "eu tenho um horário no UTC" significava que o OP tinha umdatetime
objeto inconsciente que se supunha estar no UTC para o qual ele queria obter umepoch
(se pordatetime
acaso estiver ciente de TZ, isso pode realmente mudar as coisas). Além disso, mantenha em mente que esta resposta é quase 8 anos de idade e um monte de coisas aconteceram desde (arrow
foi lançado em 2013, por exemplo)fonte
time.time()
(mktime()
pode falhar durante as transições de horário de verão enquantotime.time()
continua a funcionar). E não responde à pergunta, a menos que o fuso horário local seja UTC (a entrada na pergunta está em UTC). Mesmo que a entrada represente um horário local,mktime()
também poderá falhar em datas passadas / futuras se não usar o banco de dados tz e se o fuso horário local puder ter desvios de utc diferentes ao longo dos anos, por exemplo, Europa / Moscou em 2010-2015 - - use a hora UTC (como na pergunta) ou os objetos de data e hora com reconhecimento de fuso horário..now()
) para carimbo de data / hora da época (retornado pormktime()
) . Se você ler; você entende porque UTC entrada (usado na pergunta) é (muito) mais preferível do que um objeto datetime ingênuo representando hora local(Desculpe, não me deixe comentar sobre a resposta existente)
fonte
se você só precisa de um carimbo de data / hora no horário unix / época, esta linha funciona:
e depende apenas de
datetime
trabalhos em python2 e python3fonte
Isso funciona no Python 2 e 3:
Apenas seguindo os documentos oficiais ... https://docs.python.org/2/library/time.html#module-time
fonte
Para uma solução explícita e independente do fuso horário, use a biblioteca pytz.
Saída (flutuante): 1333238400.0
fonte
No Python 3.7
https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat
fonte