Estoy tratando con fechas en Python y necesito convertirlas a marcas de tiempo UTC para usarlas dentro de Javascript. El siguiente código no funciona:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
Convertir el objeto de fecha primero en fecha y hora tampoco ayuda. Probé el ejemplo en este enlace desde, pero:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
y ahora tampoco:
mktime(utc.localize(input_date).utctimetuple())
o
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
funciona.
Pregunta general: ¿cómo puedo convertir una fecha a segundos desde la época según UTC?
datetime.date
, el otro intenta convertir una representación de cadena de una zona horaria a otra. Como alguien que busca una solución a este problema, no puedo concluir que este último proporcionará la respuesta que estoy buscando.Respuestas:
Si
d = date(2011, 1, 1)
está en UTC:Si
d
está en la zona horaria local:timestamp1
ytimestamp2
puede diferir si la medianoche en la zona horaria local no es la misma instancia que la medianoche en UTC.mktime()
puede devolver un resultado incorrecto sid
corresponde a una hora local ambigua (p. ej., durante la transición DST) o sid
es una fecha pasada (futura) en la que el desplazamiento utc podría haber sido diferente y el Cmktime()
no tiene acceso a la base de datos tz en la plataforma dada . Puede usar elpytz
módulo (p. Ej., Víatzlocal.get_localzone()
) para obtener acceso a la base de datos tz en todas las plataformas . Además,utcfromtimestamp()
puede fallar ymktime()
puede devolver una marca de tiempo que no sea POSIX si"right"
se utiliza la zona horaria .Para convertir el
datetime.date
objeto que representa la fecha en UTC sincalendar.timegm()
:¿Cómo puedo convertir una fecha a segundos desde la época según UTC?
Para convertir
datetime.datetime
(nodatetime.date
) objeto que ya representa el tiempo en UTC a la marca de tiempo POSIX correspondiente (afloat
).Python 3.3+
datetime.timestamp()
:Nota: es necesario proporcionar
timezone.utc
explícitamente, de lo contrario,.timestamp()
suponga que su ingenuo objeto de fecha y hora se encuentra en la zona horaria local.Python 3 (<3.3)
De los documentos para
datetime.utcfromtimestamp()
:Lectura interesante: Hora de la época versus hora del día sobre la diferencia entre ¿Qué hora es? y ¿Cuántos segundos han transcurrido?
Ver también: datetime necesita un método de "época"
Python 2
Para adaptar el código anterior para Python 2:
donde
timedelta.total_seconds()
es equivalente a(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
calculado con verdadera división habilitada.Ejemplo
Cuidado con los problemas de punto flotante .
Salida
Cómo convertir un
datetime
objeto consciente a la marca de tiempo POSIXEn Python 3:
En Python 2:
fuente
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
:?datetime(1970, 1, 1)
es más explícito.fromtimestamp()
es incorrecto aquí (dt
está en UTC, por lo queutcfromtimestamp()
debería usarse en su lugar).totimestamp()
función en la respuesta.Por sólo sistemas UNIX :
Nota 1: dizzyf observó que esto aplica zonas horarias localizadas . No utilizar en producción.
Nota 2: Jakub Narębski señaló que esto ignora la información de la zona horaria incluso para datetime con reconocimiento de desplazamiento (probado para Python 2.7).
fuente
man strftime
en sistemas similares a Unix.Supuesto 1: está intentando convertir una fecha en una marca de tiempo, sin embargo, dado que una fecha cubre un período de 24 horas, no hay una sola marca de tiempo que represente esa fecha. Asumiré que desea representar la marca de tiempo de esa fecha a medianoche (00: 00: 00.000).
Supuesto 2: la fecha que presenta no está asociada con una zona horaria en particular, sin embargo, desea determinar el desplazamiento desde una zona horaria en particular (UTC). Sin conocer la zona horaria en la que se encuentra la fecha, no es posible calcular una marca de tiempo para una zona horaria específica. Asumiré que desea tratar la fecha como si estuviera en la zona horaria del sistema local.
Primero, puede convertir la instancia de fecha en una tupla que represente los diversos componentes de tiempo utilizando el
timetuple()
miembro:Luego puede convertir eso en una marca de tiempo usando
time.mktime
:Puede verificar este método probándolo con el tiempo de la época (1970-01-01), en cuyo caso la función debería devolver el desplazamiento de la zona horaria para la zona horaria local en esa fecha:
28800.0
son 8 horas, lo que sería correcto para la zona horaria del Pacífico (donde estoy).fuente
siga el documento python2.7, debe usar calendar.timegm () en lugar de time.mktime ()
fuente
d
está en UTC?Definí mis propias dos funciones
aquí:
fuente
La pregunta es un poco confusa. las marcas de tiempo no son UTC, son una cosa de Unix. la fecha puede ser UTC? suponiendo que lo sea, y si está utilizando Python 3.2+, simple-date hace que esto sea trivial:
si realmente tiene el año, mes y día, no necesita crear el
date
:y si la fecha está en otra zona horaria (esto es importante porque estamos asumiendo la medianoche sin una hora asociada):
[La idea detrás de simple-date es recolectar todas las cosas de fecha y hora de Python en una clase consistente, para que pueda hacer cualquier conversión. entonces, por ejemplo, también irá a la inversa:
]
fuente
SimpleDate(date(2011,1,1), tz='America/New_York')
aumentaNoTimezone
, mientraspytz.timezone('America/New_York')
que no genera ninguna excepción (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
Aparece un error , parece que solo es python3 / pip3.Usando el paquete de flechas :
fuente
arrow
utilizadateutil
ydateutil
conoce desde hace muchos años errores relacionados con el manejo de la zona horaria. No lo use si necesita resultados correctos para zonas horarias con un desplazamiento UTC no fijo (está bien usarlo para la zona horaria UTC, pero stdlib también maneja el caso UTC).Una cadena de tiempo completa contiene:
[+HHMM or -HHMM]
Por ejemplo:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
Nota:
Editar:
fuente
1970-01-01 06:00:00 +0500
a3600
lo que pediste.timezone
en elpython2
, que puede hacer el cálculo (06:00:00
-+0500
=01:00:00
) manualmente.Teniendo en cuenta que tiene un
datetime
objeto llamadod
, use lo siguiente para obtener la marca de tiempo en UTC:Y para la dirección opuesta, use lo siguiente:
fuente
Estoy impresionado de la discusión profunda.
mis 2 centavos:
desde datetime import datetime import time
la marca de tiempo en utc es:
o,
si ahora resulta de datetime.now (), en el mismo horario de verano
fuente