Estoy analizando las alertas del Servicio Meteorológico Nacional en una aplicación web. Me gustaría depurar las alertas cuando lleguen a su hora de vencimiento. También me gustaría mostrar la hora de caducidad en el formato de hora local para el área geográfica a la que pertenecen.Convirtiendo la cadena de fecha de reconocimiento de zona horaria en UTC y de vuelta en Python
Las alertas cubren todo EE. UU., Por lo que creo que el mejor enfoque es almacenar y comparar las horas en las marcas de tiempo UTC. El tiempo de caducidad llega al feed como una cadena como esta: 2011-09-09T22:12:00-04:00
.
estoy usando los dateutils Labix paquete para analizar la cadena de zona horaria de una manera consciente:
>>> from dateutil.parser import parse
>>> d = parse("2011-09-18T15:52:00-04:00")
>>> d
datetime.datetime(2011, 9, 18, 15, 52, tzinfo=tzoffset(None, -14400))
también soy capaz de capturar el desplazamiento en hora UTC:
>>> offset_hours = (d.utcoffset().days * 86400 + d.utcoffset().seconds)/3600
>>> offset_hours
-4
Utilizando los métodos datetime.utctimetuple()
y time.mktime()
, soy capaz de convertir la fecha analizada a una marca de hora UTC:
>>> import time
>>> expiration_utc_ts = time.mktime(d.utctimetuple())
>>> expiration_utc_ts
1316393520.0
En este punto, me siento bastante bien de poder convertir las cadenas sin formato en una marca de tiempo que representa el tiempo de caducidad en UTC. Soy capaz de comparar el tiempo actual como una marca de hora UTC del vencimiento y determinar si necesita ser purgado:
>>> now_utc_ts = time.mktime(time.gmtime())
>>> now_utc_ts
1316398744.0
>>> now_utc_ts >= expiration_tc_ts
True
La dificultad que estoy teniendo está tratando de convertir mi marca de hora UTC almacenada nuevo a la original formato localizado. Tengo las horas de compensación almacenados de la conversión original y una cadena que analizan para almacenar la etiqueta zona horaria:
>>> print offset_hours
-4
>>> print timezone
EDT
me gustaría convertir la marca de hora UTC de nuevo a la vez formateado localmente, pero convertir de nuevo a un datetime
no parece estar funcionando:
>>> import datetime
>>> datetime.datetime.fromtimestamp(expiration_utc_ts) + datetime.timedelta(hours=offset_hours)
datetime.datetime(2011, 9, 18, 16, 52) # The hour is 16 but it should be 15
parece que está fuera por una hora. No estoy seguro de dónde se introdujo el error? Reuní otra prueba y obtuve resultados similares:
>>> # Running this at 21:29pm EDT
>>> utc_now = datetime.datetime.utcnow()
>>> utc_now_ts = time.mktime(right_now.utctimetuple())
>>> datetime.datetime.fromtimestamp(utc_now_ts)
datetime.datetime(2011, 9, 18, 22, 29, 47) # Off by 1 hour
¿Alguien me puede ayudar a encontrar mi error? No estoy seguro si es un problema de ahorro de luz diurna? Me encontré con algunas cosas que me llevan a creer que podría estar tratando de localizar mis fechas y horas, pero en este punto estoy bastante perplejo. Tenía la esperanza de hacer todos estos cálculos/comparaciones en una forma de tiempo-agnóstica.
posible duplicado de [Problema con Python/pytz La conversión de zona horaria local para luego volver UTC] (http://stackoverflow.com/questions/7465181/issue-with-python-pytz-converting- from-local-timezone-to-utc-then-back) – agf
Hubiera pensado que podría hacer todo esto con objetos datetime, y no convertir a tuplas o marcas de tiempo. Si crea un objeto datetime "now" compatible con la zona horaria, simplemente haga "if x
Yo también lo esperaba, pero PostgreSQL no quiso localizar el valor de fecha y hora. (Estoy seguro de que hay una forma de evitarlo, pero pensé que sería más fácil ahora solo almacenar las marcas de tiempo UTC) – Scott