Como obter os segundos desde a época da saída de data e hora de gmtime ()?


162

Como você inverte gmtime(), onde coloca a hora + data e obtém o número de segundos?

Eu tenho seqüências de caracteres como 'Jul 9, 2009 @ 20:02:58 UTC'e quero recuperar o número de segundos entre a época e 9 de julho de 2009.

Eu tentei, time.strftimemas não sei como usá-lo corretamente ou se é o comando correto a ser usado.

Respostas:


123

Se você chegou aqui porque um mecanismo de pesquisa disse a você como obter o carimbo de data e hora do Unix, pare de ler esta resposta. Role para baixo um.

Se você quiser reverter time.gmtime(), você quer calendar.timegm().

>>> calendar.timegm(time.gmtime())
1293581619.0

Você pode transformar sua string em uma tupla de tempo com time.strptime(), que retorna uma tupla de tempo para a qual você pode passar calendar.timegm():

>>> import calendar
>>> import time
>>> calendar.timegm(time.strptime('Jul 9, 2009 @ 20:02:58 UTC', '%b %d, %Y @ %H:%M:%S UTC'))
1247169778

Mais informações sobre o módulo de calendário aqui


16
Se você está procurando a hora atual da época unix, consulte o comentário de @ DanJ ou a resposta de naren, esta resposta está incorreta!
kosii

639

Use o módulo de tempo :

epoch_time = int(time.time())

14
@ DanJ: é o número de segundos decorridos desde a Época (um momento fixo no tempo) e é o mesmo em qualquer fuso horário. Porém, se ignorarmos instâncias de tempo em torno de segundos bissextos; é fácil convertê-lo para UTC se timeusar a época Unix (1970).
JFS

42
Observe que não é o que o OP estava pedindo, mas era o que eu queria. Então, +1.
Fearless_fool

6
é a resposta para o que é perguntado no título: "obtendo o tempo desde a época". 1
AlejandroVD

@JFSebastian isso dá época a segundos. Como posso obter a resolução em milissegundos usando a mesma resposta acima?
Marlon Abeykoon

2
para estender meu comentário acima : time.time()value NÃO depende do fuso horário local (se excluirmos fusos horários "corretos" e similares), por exemplo, se ele retornar o tempo POSIX (como acontece na maioria dos sistemas), será o número de segundos SI desde a época (1970-01-01UTC) sem contar segundos bissextos. Este valor pode ser convertido para UTC (excluindo segundos bissextos), mas não é UTC . @MarlonAbeykoon: Eu gosto de esta resposta
jfs

10

Observe que time.gmtimemapeia o registro 0de data e hora para 1970-1-1 00:00:00.

In [61]: import time       
In [63]: time.gmtime(0)
Out[63]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

time.mktime(time.gmtime(0)) fornece um carimbo de data / hora alterado de acordo com a sua localidade, que geralmente não pode ser 0.

In [64]: time.mktime(time.gmtime(0))
Out[64]: 18000.0

O inverso de time.gmtimeé calendar.timegm:

In [62]: import calendar    
In [65]: calendar.timegm(time.gmtime(0))
Out[65]: 0

Isto dá uma melhor explicação e exemplo para time.mktime (que tomar fuso horário atual em conta), graças
Jkm

@ Jkm: NÃO use mktime()com gmtime(). mktime()aceita a hora local, mas gmtime()retorna a hora UTC - seu fuso horário local pode e provavelmente será diferente. "registro de data e hora em relação ao seu código do idioma" não faz sentido: o registro de data e hora do POSIX não depende do seu código de idioma (fuso horário local) - é o mesmo valor em todo o mundo. "segundos desde a época" é o carimbo de data / hora do POSIX na maioria dos casos (mesmo no Windows) - coisas como fusos horários "certos" que usam a escala de tempo TAI não são comuns. Consulte O time.time () do Python retorna o carimbo de data / hora local ou UTC?
precisa saber é

@JF Sebastian Você está certo. Na verdade, eu tenho alguns problemas mktime()recentemente. Para alguns servidores Web python (Tornado, por exemplo), como o processo continua em execução, mesmo que eu mude o código do idioma do sistema, os mktime()chamados pela API do servidor Web ainda usam o fuso horário antigo para gerar o objeto de tempo. Eu tenho que mudar gmtime()e aplicar manualmente o deslocamento gmt.
Jkm

5
ep = datetime.datetime(1970,1,1,0,0,0)
x = (datetime.datetime.utcnow()- ep).total_seconds()

Isso deve ser diferente int(time.time()), mas é seguro usar algo comox % (60*60*24)

datetime - tipos básicos de data e hora:

Ao contrário do módulo de hora, o módulo de data e hora não suporta segundos bissextos.


3
t = datetime.strptime('Jul 9, 2009 @ 20:02:58 UTC',"%b %d, %Y @ %H:%M:%S %Z")

Não consigo acessar o strptime por algum motivo. Eu importei datetime
calccrypto

1
@calccrypto você tem que quer from datetime import datetimeou fazerdatetime.datetime.strptime
pathikrit

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.