2009-08-19 19 views
6

Digamos que tengo una zona horaria como "2009-08-18 13: 52: 54-04". Puedo analizar la mayor parte de ella utilizando una línea como esta:¿Cómo se analizan las zonas horarias con desplazamientos UTC en Python?

datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S") 

Sin embargo, no puedo obtener la zona horaria para trabajar. Hay un% Z que maneja zonas horarias textuales ("EST", "UTC", etc.) pero no veo nada que pueda analizar "-04".

+0

Dupe- [¿Cómo puedo traducir una cadena de fecha y hora ISO 8601 en un objeto de fecha y hora Python?] (Http://stackoverflow.com/questions/969285/how-do-i-translate-a-iso-8601-datetime-string-into-a-python-datetime-object/3908349 # 3908349) (y la respuesta es 'dateutil.parser.parse (datetring) 'en ambos) – Yarin

+0

relacionado: [Cómo analizar las fechas con -0400 cadena de zona horaria en python?] (http://stackoverflow.com/q/1101508/4279) – jfs

Respuesta

0

me encontré con el mismo problema hace poco y trabajé alrededor de ella utilizando este código:

gmt_offset_str = time_string[-3:] 
gmt_offset_seconds = int(gmt_offset_str)*60*60 
timestamp = time.strptime(time_string[:-4], '%Y-%m-%d %H:%M:%S') 
return time.localtime(time.mktime(timestamp)-gmt_offset_seconds) 

Me gustaría que le interesen también una solución más elegante.

+3

Es un solución bastante ingenua. Funciona, pero obtendrá problemas desagradables cuando trabaje durante el horario de ahorro diurno y los que no lo utilicen. Es mejor usar los objetos incorporados. – voyager

+0

'mktime()' es incorrecto aquí. Use 'calendar.timegm()' en su lugar. 'email.utils.mktime_tz' de stdlib tenía el mismo error antes de Python 2.7.4 – jfs

0

Usted puede hacer que directrly en el constructor: class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]), tzinfo ser un objeto dervided datetime.tzinfo.

tzinfo es una clase base abstracta, lo que significa que esta clase no se debe instanciar directamente. Debe derivar una subclase concreta y (al menos) suministrar implementaciones de los métodos estándar tzinfo necesarios para los métodos datetime que utiliza. El módulo de fecha y hora no proporciona subclases concretas de tzinfo.

Lo que debe sobrescribir es el método utcoffset(self, dt).

Desplazamiento de retorno de la hora local desde UTC, en minutos al este de UTC. Si la hora local está al oeste de UTC, esto debería ser negativo. Tenga en cuenta que esta es la compensación total de UTC; por ejemplo, si un objeto tzinfo representa los ajustes de zona horaria y horario de verano, utcoffset() debe devolver su suma. Si no se conoce el desplazamiento UTC, devuelva None. De lo contrario, el valor devuelto debe ser un objeto timedelta que especifique un número entero de minutos en el rango de -1439 a 1439 inclusive (1440 = 24 * 60; la magnitud del desplazamiento debe ser inferior a un día). La mayoría de las implementaciones de UTCOFFSET() probablemente tendrán uno de estos dos:

return CONSTANT # fixed-offset class

return CONSTANT + self.dst(dt) # daylight-aware class

Si UTCOFFSET() no devuelve Ninguno, horario de verano() no debe volver Ninguno tampoco.

La implementación predeterminada de utcoffset() aumenta NotImplementedError.

22

Quizás podría usar dateutil.parser.parse? Ese método también se menciona en wiki.python.org/WorkingWithTime.

>>> from dateutil.parser import parse 
>>> parse("2009-08-18 13:52:54-04") 
datetime.datetime(2009, 8, 18, 13, 52, 54, tzinfo=tzoffset(None, -14400)) 

(es esta pregunta un duplicado?)

+3

+1 para dateutil. Esta es tu respuesta – Yarin

Cuestiones relacionadas