¿Cuál es la forma más fácil de obtener la hora GMT actual en formato de marca de tiempo Unix?

175

Python ofrece diferentes paquetes ( datetime, time, calendar) como se puede ver aquí con el fin de hacer frente a tiempo. Cometí un gran error al usar lo siguiente para obtener el tiempo GMT actualtime.mktime(datetime.datetime.utcnow().timetuple())

¿Cuál es una manera simple de obtener la hora GMT actual en la marca de tiempo de Unix?

Cory
fuente
1
¿Qué son las entradas / salidas? datetime.utcnow()devuelve la hora UTC actual como objeto de fecha y hora (supongo que desea UTC cuando habla de "hora GMT"). time.time()devuelve la marca de tiempo de Unix directamente como número flotante. Aquí le mostramos cómo convertir datetime.date/datetime.datetime que representa la hora en UTC a la marca de tiempo POSIX .
jfs
¿Su método propuesto es incorrecto o demasiado detallado? Relacionado: stackoverflow.com/questions/15940280/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
¿Por qué fue un error tu método?
skeller88

Respuestas:

230

Usaría time.time () para obtener una marca de tiempo en segundos desde la época.

import time

time.time()

Salida:

1369550494.884832

Para la implementación estándar de CPython en la mayoría de las plataformas, esto devolverá un valor UTC.

Edmond Burnett
fuente
21
El problema es que el reloj local de su máquina puede no estar en UTC.
9000
@ 9000: Correcto, aunque siempre insistiría en UTC en cualquier entorno donde el tiempo importara. Y pidió la solución más simple. Tenga en cuenta que con CPython en plataformas modernas, incluidas Linux, BSD, Mac OS X y Windows, todos devolverán UTC por time.time (). Esto refleja el comportamiento de la función de tiempo de la biblioteca estándar C en estos sistemas operativos.
Edmond Burnett
66
@ 9000: la zona horaria local no importa. El tiempo Unix corresponde al tiempo UTC (si ignoramos el tiempo en segundos bisiestos). Piénselo: la marca de tiempo es el número de segundos transcurridos desde la época (un momento fijo en el tiempo): ¿por qué dependería de qué reloj local utiliza la máquina de zona horaria? En cualquier momento dado, el tiempo de Unix es el mismo en todo el mundo. Algunas plataformas (desconocidas) podrían usar una época diferente, pero su valor aún no dependería de la zona horaria local.
jfs
stackoverflow.com/questions/13890935/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
125
import time

int(time.time()) 

Salida:

1521462189
Max
fuente
42

¿Esto ayuda?

from datetime import datetime
import calendar

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

Cómo convertir el objeto de fecha y hora UTC de Python a la marca de tiempo de UNIX

Nick Caplinger
fuente
@Cairnarvon Eso fue solo un ejemplo. Si desea la marca de tiempo actual, simplemente puede llamar time.time()y no necesita ninguna conversión de fecha y hora.
Messa
1
FWIW: Esa no es la hora UTC, es UTC convertida a hora local. Para obtener una marca de tiempo en UTC, debe hacer otra cosa.
Sherlock70
18

O simplemente usando el módulo estándar de fecha y hora

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

Puede truncar o multiplicar según la resolución que desee. Este ejemplo está generando millis.

Si desea una marca de tiempo Unix adecuada (en segundos), elimine el* 1000

Maresh
fuente
Su código muy específico está forzando el tiempo a un número entero, así que estoy confundido ¿por qué el texto de salida es un número decimal?
Weston
ye my my bad, agregué el int casting más tarde
Maresh
Este es el equivalente exacto de la momentbiblioteca Javascript moment().utc().valueOf(). Exactamente lo que estaba buscando. Gracias
azhar22k
Se supone que la marca de tiempo UNIX son segundos desde 1970. Su solución no produce esto.
Skyking
1
"Puede truncar o multiplicar según la resolución que desee" Suelte la parte * 1000 y obtendrá segundos.
Maresh
18

python2 y python3

es bueno usar el módulo de tiempo

import time
int(time.time())

1573708436

también puede usar el módulo de fecha y hora, pero cuando usa strftime ('% s'), ¡pero el tiempo de conversión convierte el tiempo de strft a su hora local!

python2

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

python3

from datetime import datetime
datetime.utcnow().timestamp()
MikA
fuente
2
Estar en UTC + 1, time.time()y datetime.utcnow().timestamp()no , no dará el mismo valor!
user136036
Además, aunque esperaba que la segunda opción fuera correcta, tuve que usar datetime.now (). Timestamp () para obtener el valor correcto en UTC + 1100. Esperaba que la marca de tiempo () funcionara correctamente, pero no parece ser así
David Waterworth
Mirando más de cerca, datetime.utcnow () y datetime.now () devuelven una fecha y hora ingenua (sin tzinfo), y la marca de tiempo () parece asumir local cuando tzinfo = null.
David Waterworth
2

Me gusta este metodo:

import datetime, time

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

No se garantiza que los otros métodos publicados aquí le brinden UTC en todas las plataformas o solo informen segundos completos. Si desea una resolución completa, esto funciona, al microsegundo.

vschmidt
fuente
1
Desafortunadamente, esto no parece dar UTC a menos que esté en una zona horaria UTC + 0000. Sin utctimetupleembargo, el uso hace el truco.
Skyking
1
from datetime import datetime as dt
dt.utcnow().strftime("%s")

Salida:

1544524990
2ni
fuente
Esto no devuelve lo mismo que time.time()para mí.
Alwinius
1
Probablemente sea porque dt.utcnowdevuelve una datetimeinformación sin zona horaria. Luego strftimeasume que datetimees la hora local.
Skyking
1
@skyking ¡Este es prácticamente el problema para casi todas las respuestas en esta página!
David Waterworth
1
#First Example:
from datetime import datetime, timezone    
timstamp1 =int(datetime.now(tz=timezone.utc).timestamp() * 1000)
print(timstamp1)

Salida: 1572878043380

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

Salida: 1572878043

  • Aquí, podemos ver que el primer ejemplo proporciona un tiempo más preciso que el segundo.
  • Aquí estoy usando el primero.
Chandan Sharma
fuente
1

Al menos en python3, esto funciona:

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