¿Cómo obtener la hora UTC en Python?

¿Cómo obtengo la hora UTC, es decir, milisegundos desde Época de Unix el 1 de enero de 1970?

preguntado el 11 de abril de 13 a las 04:04

Espera, ¿estás usando Python o JavaScript? -

Él está usando Python. -

8 Respuestas

Utiliza datetime.utcnow():

from datetime import datetime
datetime.utcnow()

Para sus propósitos, cuando necesite calcular la cantidad de tiempo transcurrido entre dos fechas, todo lo que necesita es restar las fechas de finalización y de inicio. El resultado de tal resta es un timedelta objeto.

De los documentos de Python:

class datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

Y esto significa que, de forma predeterminada, puede obtener cualquiera de los campos mencionados en su definición: días, segundos, microsegundos, milisegundos, minutos, horas, semanas. También la instancia timedelta tiene el método total_seconds() que:

Devuelve el número total de segundos contenidos en la duración. Equivalente a (td.microsegundos + (td.segundos + td.días * 24 * 3600) * 106) / 106 calculado con división verdadera habilitada.

contestado el 31 de mayo de 22 a las 08:05

posiblemente una sorpresa desagradable sobre datetime.utcnow() es que no devuelve un objeto consciente de la zona horaria a pesar del nombre. En mi opinión, este es un gran problema, por lo que prefiero mi respuesta a continuación. Consulte "los objetos de fecha y hora sin zona horaria deben considerarse como un "error" en la aplicación". julien.danjou.info/python-and-timezones - tim richardson

El concepto de un objeto de fecha y hora ingenuo (es decir, no se establece información de zona horaria) tiene un propósito: quiero que mi despertador suene a las 06:00:00 todos los días, sin importar en qué parte del mundo me encuentre. También permite "relojes virtuales" en, por ejemplo, juegos de computadora: Ahora son las 5 pm en mi mundo de fantasía. Forzar una zona horaria en el objeto de fecha y hora sería incómodo, especialmente con la aritmética timedelta. - Byte de polvo

Consciente de la zona horaria datetime objeto, diferente a datetime.utcnow():

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)

Marca de tiempo en milisegundos desde la época de Unix:

datetime.now(timezone.utc).timestamp() * 1000

contestado el 31 de mayo de 22 a las 08:05

Según la documentación de Python 3, esta es la forma recomendada de hacerlo. - Roskakori

¡Limpio y fácil! Debería ser la forma preferida. - Marry35

@ Marry35 sí, esta debería ser la forma preferida AHORA. Cuando se hizo la pregunta por primera vez timezone.utc no existió. - marca rescate

Y si prefiere tener la hora local (por ejemplo, para mostrarla más fácilmente al usuario) pero aún así estar seguro de la zona horaria, puede usar datetime.now().astimezone() - Martín Cejp

En la forma más cercana a su original:

import datetime

def UtcNow():
    now = datetime.datetime.utcnow()
    return now

Si necesita saber la cantidad de segundos desde 1970-01-01 en lugar de un Python nativo datetime, usa esto en su lugar:

return (now - datetime.datetime(1970, 1, 1)).total_seconds()

Python tiene convenciones de nomenclatura que están en desacuerdo con lo que podría estar acostumbrado en Javascript, consulte PEP 8. Además, una función que simplemente devuelve el resultado de otra función es bastante tonta; si solo se trata de hacerlo más accesible, puede crear otro nombre para una función simplemente asignándolo. El primer ejemplo anterior podría ser reemplazado con:

utc_now = datetime.datetime.utcnow

Respondido 22 ago 16, 14:08

Me gusta más tu respuesta que la mejor calificada de arriba. Gracias por la profundidad aquí. - Jordan Dea Mattson

Tal vez debería considerar envolver UtcNow() en otra función. Es demasiado simple. También siga sin usar guiones bajos. PEP 8 es tan aburrido... - vcarel

Definitivamente no es necesario escribir una función para devolver una sola línea simple... datetime.datetime.utcnow() - cpreid

@cpreid mi hábito es escribir la respuesta cerca del formato del código dado en la pregunta. Siento que eso ayuda a la comprensión. - marca rescate

UtcNow = datetime.datetime.utcnow (Las funciones son ciudadanos de primera clase en Python; no necesita crear una nueva función aquí, para llamarla con un nombre diferente). - jfs

import datetime
import pytz

# datetime object with timezone awareness:
datetime.datetime.now(tz=pytz.utc)

# seconds from epoch:
datetime.datetime.now(tz=pytz.utc).timestamp() 

# ms from epoch:
int(datetime.datetime.now(tz=pytz.utc).timestamp() * 1000) 

Respondido el 03 de Septiembre de 18 a las 09:09

pytz está en desuso ahora que zoneinfo DB/paquete se ha movido a Std Lib. - Marc

Consciente de la zona horaria con cero dependencias externas:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)

Respondido 25 Feb 19, 16:02

Para imprimirlo en formato zulú, este es el camino a seguir. datetime.utcnow().replace(tzinfo=timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ') - Imtiaz Shakil Siddique

¿En qué se diferencia de datetime.now(timezone.utc)? Sólo curioso. porque creo que el resultado es exactamente el mismo. - Gagan profundo singh

@GaganDeepSingh Ambos dan exactamente lo mismo datetime objeto. (A veces hay varias rutas al mismo destino). .replace(tzinfo=timezone.utc) simplemente establece el .tzinfo miembro que lamentablemente None por defecto. - mateen ulhaq

Desde datetime.datetime ya puede exportar a marcas de tiempo con el método strftime. Siguiendo tu ejemplo de función:

import datetime
def UtcNow():
    now = datetime.datetime.utcnow()
    return int(now.strftime("%s"))

Si desea microsegundos, debe cambiar la cadena de exportación y convertir para flotar como: return float(now.strftime("%s.%f"))

Respondido el 16 de enero de 18 a las 00:01

¿Cuál es el punto de convertir a una cadena y luego volver a un número cuando puede obtener el número directamente? - marca rescate

El punto es que es posible que desee cambiar las cosas en la función y, por esa razón, es mejor ceñirse al objeto de fecha y hora, no usar time.time(), También puede usar time.mktime(now.timetuple()) para convertir directamente a int. De todos modos, para este caso simple time.time() también es una opción válida. Lo que encuentro extraño es ir por timedelta para encontrar los segundos. - hectorcanto

Tenga en cuenta que strftime("%s") depende de la plataforma y no funciona en Windows. (Al menos no para mí en Windows 10). - julian kirsch

podrías usar datetime biblioteca para obtener la hora UTC, incluso la hora local.

import datetime

utc_time = datetime.datetime.utcnow() 
print(utc_time.strftime('%Y%m%d %H%M%S'))

Respondido 19 Feb 21, 06:02

¿Por qué todas las respuestas se basan en la fecha y hora y no en la hora? Creo que es la manera fácil!

import time
nowgmt = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
print(nowgmt)

Respondido 28 ago 21, 15:08

nowgmt será una cadena, que es menos flexible que tener un objeto de fecha y hora: sezanzeb

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.