¿Cómo obtener la hora UTC en Python?

113

He buscado una solución en StackExchange pero nada hace lo que necesito. En JavaScript, estoy usando lo siguiente para calcular la hora UTC desde el 1 de enero de 1970:

function UtcNow() {
    var now = new Date();
    var utc = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());
    return utc;
}

¿Cuál sería el código Python equivalente?

James Clarke
fuente
Espera, ¿estás usando Python o JavaScript?
CheetSheatOverlode

Respuestas:

179

Pruebe este código que usa 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 sustracción es un objeto timedelta.

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. Además, 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.microseconds + (td.seconds + td.days * 24 * 3600) * 10 * 6) / 10 * 6 calculado con la división verdadera habilitada.

Artsiom Rudzenka
fuente
2
Posiblemente una desagradable sorpresa 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
1
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, digamos, 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.
DustByte
42

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 de 1970-01-01 en lugar de un Python nativo datetime, use 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 hacerla más accesible, puede crear otro nombre para una función simplemente asignándola. El primer ejemplo anterior podría reemplazarse por:

utc_now = datetime.datetime.utcnow
Mark Ransom
fuente
1
Me gusta más tu respuesta que la mejor calificada de arriba. Gracias por la profundidad aquí.
Jordan Dea-Mattson
@Jordan, revisando mi respuesta me doy cuenta de que cometí un error de estilo al poner la importación dentro de la función en lugar de a nivel global, voy a arreglar eso ahora.
Mark Ransom
8
Quizás debería considerar envolver UtcNow () en otra función. Es demasiado simple. Además, siga sin usar guiones bajos. PEP 8 es tan aburrido ...
vcarel
1
Definitivamente no es necesario escribir una función para devolver un simple de una sola línea ... datetime.datetime.utcnow ()
cpreid
1
@TimRichardson No estoy en desacuerdo, pero en el momento en que se escribió esta respuesta no había otra alternativa: Python no incluía ningún tzinfoobjeto, ni siquiera para UTC.
Mark Ransom
31

Solo biblioteca estándar simple, para Python moderno. Da fecha y hora con reconocimiento de zona horaria, a diferencia de datetime.utcnow(). datetimessin zonas horarias hay accidentes que esperan suceder.

from datetime import datetime,timezone
now_utc = datetime.now(timezone.utc)
Tim Richardson
fuente
5
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
21
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) 
MikeL
fuente
10

Desde datetime.datetime ya puede exportar a marcas de tiempo con el método strftime. Siguiendo su 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"))

hectorcanto
fuente
¿Cuál es el punto de convertir a una cadena y luego volver a un número cuando puede obtener el número directamente?
Mark Ransom
El punto es que es posible que desee cambiar cosas en la función y, por esa razón, es mejor atenerse al objeto datetime, no usarlo time.time(). También puede usar time.mktime (now.timetuple ()) para convertir directamente a int. De todos modos, para este simple caso time.time()también es una opción válida. Lo que me parece extraño es ir por timedelta para encontrar los segundos.
hectorcanto
Tenga en cuenta que eso strftime("%s")depende de la plataforma y no funciona en Windows. (Al menos no es así para mí en Windows 10).
Julian Kirsch
8

Zona horaria consciente con cero dependencias externas:

from datetime import datetime, timezone

def utc_now():
    return datetime.utcnow().replace(tzinfo=timezone.utc)
Cesar Canassa
fuente
-4

En Python 3 usando la expresión lambda, pruebe;

from datetime import datetime
utc_now = lambda : datetime.utcnow()

y llamar a la función normalmente;

print(utc_now())
DINERO DE LA CALLE
fuente
2
sean buenos ahora niños; ^)
Demis