2011-07-15 12 views
7

Recupero una marca de tiempo de unix de un servicio web en un programa de Python. Esta marca de tiempo está en una zona horaria de EE. UU. Para insertarlo en una base de datos MySQL con otros objetos, localizados en Francia, me gustaría convertir esta marca de tiempo en la zona horaria francesa.Cambiar una marca de tiempo de unix a una zona horaria diferente

Podría hacerlo con funciones matemáticas, pero está el problema del horario de verano. Preferiría utilizar las funciones específicas de hora y fecha de Python, que deberían tratar estos conceptos.

¿Tiene alguna pista, estoy perdido en la documentación de Python?

+0

¿A qué corresponde el cero? 00:00:00 1 de enero de 1970 PST o 01:00:00 1 de enero de 1970 PST? –

+0

Buena pregunta, me estoy rompiendo la cabeza contra la pared durante 3 horas ... De hecho, parece que no es PST sino PDT. Tengo una hora extra (que me lleva a -7h en lugar de - 8H) pero en Francia somos UTC + 2H en verano y + 1H en invierno. No puedo resolverlo con funciones matemáticas. Probablemente necesitaría pytz – iwalktheline

+0

Mi pregunta no era precisa, eché de menos el origen del problema. Abrí otro hilo – iwalktheline

Respuesta

4

Tuve un problema similar en el pasado cuando las marcas de tiempo de los archivos que descargamos de un proveedor de servicios tenían marcas de tiempo correspondientes a la zona horaria PST. Lo siguiente me ayudó a hacer la conversión:

import pytz, datetime, time 
import os 

originalTimeStamp = os.stat("/tmp/file-from-us-west-coast").st_mtime 

# prints e.g. 2010-03-31 13:01:18 
print "original:",datetime.datetime.fromtimestamp(originalTimeStamp) 

# re-interpret 
originalTimeZone = "America/Los_Angeles" 
targetTimeZone = "Europe/Paris" 

newTimeStamp = pytz.timezone(originalTimeZone).localize(datetime.datetime.fromtimestamp(originalTimeStamp)).astimezone(pytz.timezone(targetTimeZone)) 

# prints e.g. 2010-03-31 22:01:18+02:00 
print "new:  ",newTimeStamp 

# convert back to seconds since epoch 
newTimeStamp = time.mktime(newTimeStamp.timetuple()) 

# print time difference in hours 
print (newTimeStamp - originalTimeStamp)/3600.0 
+0

Incluso si mi pregunta fue mal explicada (no encontré el problema exacto todavía), la resolvió :) – iwalktheline

+0

si puede probar fechas arbitrarias, como última prueba, le sugiero que pruebe lo que sucede con 3 de noviembre de 2011. Europa tendrá el horario de invierno mientras que los EE. UU. Todavía tienen horario de verano (consulte, por ejemplo, http://www.worldtimezone.com/daylight.html) –

5

Si realmente es una marca de tiempo Unix, entonces está basado en UTC. Simplemente inténtalo correctamente para tu caso de uso. Aplique la traducción de zona horaria solo cuando tenga que imprimir esta fecha como texto.

Si lo está almacenando también como marca de tiempo, manténgalo exactamente como está.

+1

No es una "marca de tiempo de Unix", sino la cantidad de segundos transcurridos desde el 1 de enero de 1970 según la zona horaria del Pacífico. Es feo, lo sé, pero es Facebook API. No puedo mantenerlo como está porque tengo otros objetos basados ​​en la "marca de tiempo de Unix" real: UTC – iwalktheline

+1

Si sabe que es pacífico y no cambia, puede agregar las 8 horas para hacerlo UTC y usarlo como unix marca de tiempo – viraptor

+0

De hecho Facebook api no tiene en cuenta que Francia es GMT + 2 en verano y GMT + 1 en primavera. Todo se almacena en DB como la fecha de llenado, pero en la zona horaria estándar del Pacífico. Por ejemplo, creo un evento 2011-07-15 23:00 en el sitio de Facebook. Se almacena como 2011-07-15 23: 00-0000 (PST). Todo el problema viene de aquí. Pytz resolvió el problema – iwalktheline

1

pytz podría ayudarlo aquí. Como dijo viraptor, lo ideal es que almacene todas las fechas como marcas de tiempo UTC de Unix, y solo localice el momento en que las imprime.

Cuestiones relacionadas