Qual é a maneira mais fácil de obter a hora GMT atual no formato de carimbo de data e hora do Unix?

175

Python fornece pacotes diferentes ( datetime, time, calendar), como pode ser visto aqui , a fim de lidar com o tempo. Cometi um grande erro ao usar o seguinte para obter a hora GMT atualtime.mktime(datetime.datetime.utcnow().timetuple())

Qual é uma maneira simples de obter a hora GMT atual no carimbo de data e hora do Unix?

Cory
fonte
1
O que são entrada / saída? datetime.utcnow()retorna a hora UTC atual como objeto datetime (presumo que você queira UTC quando estiver falando sobre "hora GMT"). time.time()retorna o carimbo de data e hora do Unix diretamente como número flutuante. Veja como converter datetime.date/datetime.datetime representando a hora no UTC para o carimbo de data / hora POSIX .
JFS
O seu método proposto está errado ou é muito detalhado? Relacionado: stackoverflow.com/questions/15940280/…
Ciro Santilli escreveu:
Por que seu método foi um erro?
skeller88

Respostas:

230

Eu usaria time.time () para obter um timestamp em segundos desde a época.

import time

time.time()

Resultado:

1369550494.884832

Para a implementação padrão do CPython na maioria das plataformas, isso retornará um valor UTC.

Edmond Burnett
fonte
21
O problema é que o relógio local da sua máquina pode não estar no UTC.
9000
@ 9000: Correto, embora eu sempre insistisse no UTC em qualquer ambiente em que o tempo fosse importante. E ele pediu a solução mais simples. Observe que com o CPython em plataformas modernas, incluindo Linux, BSD, Mac OS X e Windows, todos retornam UTC para time.time (). Isso reflete o comportamento da função de tempo da biblioteca padrão C nesses SOs.
Edmond Burnett 26/05
66
@ 9000: o fuso horário local não importa. A hora Unix corresponde à hora UTC (se ignorarmos a hora em torno de segundos bissextos). Pense bem: o registro de data e hora é o número de segundos decorridos desde a época (um momento fixo no tempo): por que isso dependeria do relógio local da máquina do fuso horário? A qualquer momento, o horário do Unix é o mesmo em todo o mundo. Alguma plataforma (desconhecida) pode usar uma época diferente, mas seu valor ainda não depende do fuso horário local.
JFS
125
import time

int(time.time()) 

Resultado:

1521462189
Máx.
fonte
42

Isso ajuda?

from datetime import datetime
import calendar

d = datetime.utcnow()
unixtime = calendar.timegm(d.utctimetuple())
print unixtime

Como converter o objeto de data e hora do Python UTC em carimbo de data e hora do UNIX

Nick Caplinger
fonte
@Airnarvon Isso foi apenas um exemplo. Se você deseja um registro de data e hora atual, basta ligar time.time()e não precisa de conversão de data e hora.
Messa
1
FWIW: Essa não é a hora UTC, é UTC convertida para a hora local. Para obter um registro de data e hora no UTC, você precisa fazer outra coisa.
Sherlock70
18

Ou simplesmente usando o módulo padrão de data e hora

In [2]: from datetime import timezone, datetime
   ...: int(datetime.now(tz=timezone.utc).timestamp() * 1000)
   ...: 
Out[2]: 1514901741720

Você pode truncar ou multiplicar, dependendo da resolução desejada. Este exemplo está produzindo milis.

Se você deseja um carimbo de data / hora Unix adequado (em segundos), remova o* 1000

Maresh
fonte
Você codifica muito especificamente está forçando o tempo para um número inteiro, então estou confuso por que o texto de saída é um número decimal?
Weston
ye meu mau, eu adicionei o elenco int mais tarde
Maresh
Este é o equivalente exato da momentbiblioteca Javascript moment().utc().valueOf(). Exatamente o que eu estava procurando. Graças
azhar22k
O carimbo de data e hora do UNIX deve ser segundos desde 1970. Sua solução não produz isso.
SkyKing
1
"Você pode truncar ou multiplicar, dependendo da resolução desejada" Solte a parte * 1000 e obtenha segundos.
Maresh
18

python2 e python3

é bom usar módulo de tempo

import time
int(time.time())

1573708436

você também pode usar o módulo datetime, mas quando você usa strftime ('% s'), mas o strftime converte o horário para o horário local!

python2

from datetime import datetime
datetime.utcnow().strftime('%s')

python3

from datetime import datetime
datetime.utcnow().timestamp()
MikA
fonte
2
Estar em UTC + 1, time.time()e datetime.utcnow().timestamp()que não dar o mesmo valor!
user136036
Além disso, embora eu esperasse que a segunda opção estivesse correta, tive que usar datetime.now (). Timestamp () para obter o valor correto no UTC + 1100. Eu esperava timestamp () para funcionar corretamente para qualquer um, mas não parece
David Waterworth
Olhando mais de perto, tanto datetime.utcnow () quanto datetime.now () retornam um datetime ingênuo (sem tzinfo) e o timestamp () parece assumir local quando tzinfo = null.
David Waterworth
2

Eu gosto deste método:

import datetime, time

dts = datetime.datetime.utcnow()
epochtime = round(time.mktime(dts.timetuple()) + dts.microsecond/1e6)

Os outros métodos publicados aqui não garantem o UTC em todas as plataformas ou relatam apenas segundos inteiros. Se você deseja resolução total, isso funciona, no micro-segundo.

vschmidt
fonte
1
Infelizmente, isso não parece indicar o UTC, a menos que você esteja no fuso horário UTC + 0000. Usando, em utctimetuplevez disso, faz o truque.
SkyKing
1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Resultado:

1544524990
2ni
fonte
isso não retorna o mesmo que time.time()para mim.
Alwinius
1
Provavelmente porque dt.utcnowretornou uma datetimeinformação sem fuso horário. Então strftimeassume que datetimeé a hora local.
SkyKing
1
@skyking Esse é praticamente o problema de quase todas as respostas nesta página!
David Waterworth
1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Saída: 1572878043380

#second example:
import time
timstamp2 =int(time.time())
print(timstamp2)

Saída: 1572878043

  • Aqui, podemos ver que o primeiro exemplo fornece um tempo mais preciso que o segundo.
  • Aqui estou usando o primeiro.
Chandan Sharma
fonte
1

Pelo menos em python3, isso funciona:

>>> datetime.strftime(datetime.utcnow(), "%s")
'1587503279'
usernamenumber
fonte