2008-10-31 36 views
40

¿Cómo convierto un objeto datetime o date en una indicación de fecha y hora POSIX en python? Existen métodos para crear un objeto datetime a partir de una marca de tiempo, pero no parece encontrar ninguna forma obvia de hacer la operación de la manera opuesta.Conversión de fecha y hora a hora POSIX

Respuesta

48
import time, datetime 

d = datetime.datetime.now() 
print time.mktime(d.timetuple()) 
+0

Gracias. Sabía que tenía que ser algo estúpidamente simple, pero no pude resolverlo. –

+0

Parece que, según la plataforma, el tiempo no tiene el método mktime – Tirno

+5

Tenga en cuenta que le da la hora local, no la UTC. Para UTC ver [respuesta de fixermark] (http://stackoverflow.com/q/5872022/60075). –

21

Para los cálculos UTC, calendar.timegm es la inversa de time.gmtime.

import calendar, datetime 
d = datetime.datetime.utcnow() 
print calendar.timegm(d.timetuple()) 
+0

Nota: 'calendar.timegm()' espera la entrada UTC pero el resultado (marca de tiempo) no está en ninguna zona horaria. Han transcurrido solo unos segundos desde la época (== 1969-12-31T19: 00: 00-05: 00 (Nueva York) == 1970-01-01T00: 00: 00Z (UTC) == 1970-01-01T03: 00: 00 + 03: 00 (Moscú)) - un único momento fijo en el tiempo. – jfs

+0

Corrección: debido a segundos intercalares, "segundos desde Epoch" no están * transcurridos * SI segundos desde '1970-01-01 00: 00: 00 + 00: 00'. ['utc_to_tai()' function] (https://gist.github.com/zed/a912498be36c6a947c33#file-utc_to_tai-py-L25) podría utilizarse para calcular los segundos SI transcurridos. – jfs

4

en Python, time.time() puede regresar segundo como un número de coma flotante que incluye un componente decimal con los microsegundos. Para convertir una fecha y hora a esta representación, debe agregar el componente microsegundos porque el timetuple directo no lo incluye.

import time, datetime 

posix_now = time.time() 

d = datetime.datetime.fromtimestamp(posix_now) 
no_microseconds_time = time.mktime(d.timetuple()) 
has_microseconds_time = time.mktime(d.timetuple()) + d.microsecond * 0.000001 

print posix_now 
print no_microseconds_time 
print has_microseconds_time 
+0

Excelente respuesta – pumazi

+0

no utilice la hora local para un viaje de ida y vuelta (ts -> local -> ts). Podría romperse durante las transiciones DST. Puede ampliar [timegm()] (http://hg.python.org/cpython/file/3.3/Lib/calendar.py#l597) para incluir microsegundos y usarlo para ts -> utc -> ts transformations. – jfs

2

Tenga en cuenta que Python ahora (3.5.2) incluye una built-in method para esto en datetime objetos:

>>> import datetime 
>>> now = datetime.datetime.now() 
>>> now.timestamp() # Local time 
1509315202.161655 
>>> now.replace(tzinfo=datetime.timezone.utc).timestamp() # UTC 
1509329602.161655