Desculpas pela pergunta simples ... Sou novo no Python ... Pesquisei e nada parece estar funcionando.
Eu tenho vários objetos de data e hora e quero calcular o número de segundos desde um horário fixo no passado para cada um (por exemplo, desde 1 de janeiro de 1970).
import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)
Isso parece diferenciar apenas as datas que têm dias diferentes:
t.toordinal()
Qualquer ajuda é muito apreciada.
python
python-2.7
Nathan Lippi
fonte
fonte
datetime.date
para carimbo de data / hora UTC em Pythonint(t.timestamp())
Respostas:
Para a data especial de 1º de janeiro de 1970, há várias opções.
Para qualquer outra data inicial, você precisa obter a diferença entre as duas datas em segundos. Subtrair duas datas fornece um
timedelta
objeto que, a partir do Python 2.7, tem umatotal_seconds()
função.A data de início geralmente é especificada no UTC; portanto, para obter os resultados adequados, o
datetime
feed desta fórmula também deve estar no UTC. Se vocêdatetime
ainda não está no UTC, será necessário convertê-lo antes de usá-lo ou anexar umatzinfo
classe com o deslocamento adequado.Conforme observado nos comentários, se você tiver um
tzinfo
anexo ao seudatetime
, também precisará de um na data de início ou a subtração falhará; para o exemplo acima, eu adicionariatzinfo=pytz.utc
se estivesse usando o Python 2 outzinfo=timezone.utc
se estivesse usando o Python 3.fonte
datetime.datetime(1970,1,1,tzinfo=pytz.utc)
.datetime.datetime.utcfromtimestamp(0)
usei isso para obter a 'época' facilmente. Observe que a época nem sempre é a mesma em todos os sistemas.time.time()
edatetime.now() - datetime(1970, 1, 1)
diferem em 7200 segundos. Prefiro usar(t - datetime.datetime.fromtimestamp(0)).total_seconds()
. Você não usarutcfromtimestamp(0)
se você quiser converter uma data e hora no seu fuso horário local.Para obter o tempo Unix (segundos desde 1 de janeiro de 1970):
fonte
t
é uma hora local. O deslocamento UTC para o fuso horário local pode ter sido diferente no passado e semktime()
(biblioteca C) não tiver acesso a dados históricos do fuso horário em uma determinada plataforma do que pode falhar (pytz
é uma maneira portátil de acessar o banco de dados tz). Além disso, hora local pode ser, por exemplo ambígua, durante as transições DST - você precisa de informações adicionais para disambiguate por exemplo, se você sabe que data consecutiva / valores de tempo deve aumentar em um arquivo de logtime.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())
resulta em uma1564819506.0
queda silenciosa dos milissegundos, masdatetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()
(resposta de Andrzej Pronobis) resulta no1564819506.912
resultado esperado.A partir do Python 3.3, isso se torna super fácil com o
datetime.timestamp()
método. Obviamente, isso só será útil se você precisar do número de segundos entre 1970-01-01 UTC.O valor de retorno será um valor flutuante representando frações pares de segundo. Se a data e hora for ingênua do fuso horário (como no exemplo acima), será assumido que o objeto data e hora represente a hora local, ou seja, será o número de segundos da hora atual no seu local até 01-01-2009 UTC.
fonte
Talvez fora de tópico: para obter o horário do UNIX / POSIX do datetime e convertê-lo novamente:
Observe que diferentes fusos horários têm impacto nos resultados, por exemplo, meus retornos atuais de TZ / DST:
portanto, deve-se considerar a normalização para o UTC usando as versões UTC das funções.
Observe que o resultado anterior pode ser usado para calcular o deslocamento UTC do seu fuso horário atual. Neste exemplo, é + 1h, ou seja, UTC + 0100.
Referências:
fonte
mktime()
pode falhar . Em geral, você precisapytz
converter a hora local em utc, para obter o carimbo de data / hora do POSIX.int (t.strftime("%s"))
também funcionafonte
import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)
(conforme especificado pelo OP). Mas, realmente, duvido que% s seja um formato de hora adicionado recentemente.%s
não é suportado (pode funcionar em algumas plataformas, set
for um objeto de data e hora ingênuo que representa a hora local e se a biblioteca C local tiver acesso ao banco de dados tz, caso contrário, o resultado poderá estar errado). Não use.%s
não está documentado em nenhum lugar. Eu o semeio em código real e fiquei imaginando o que é isso e procure na documentação e não existe%s
. Existe apenas com S grande apenas pelos segundos.dos documentos python:
Retorne o número total de segundos contidos na duração. Equivalente a
calculado com a divisão verdadeira ativada.
Observe que, por intervalos de tempo muito grandes (mais de 270 anos na maioria das plataformas), esse método perde a precisão de microssegundos.
Essa funcionalidade é nova na versão 2.7.
fonte
Para converter um objeto de data e hora que representa a hora no UTC em carimbo de data e hora POSIX :
Para converter um objeto de data e hora que representa a hora no fuso horário local em carimbo de data / hora do POSIX:
Consulte Como converto a hora local para UTC no Python? Se o banco de dados tz estiver disponível em uma determinada plataforma; uma solução apenas para stdlib pode funcionar .
Siga os links se precisar de soluções para
<3.3
versões do Python.fonte
Eu tentei o calendar.timegm da biblioteca padrão e funciona muito bem:
Ref: https://docs.python.org/2/library/calendar.html#calendar.timegm
fonte
aDateTime
é uma hora UTC