parse example change python date timezone

example - strftime python



¿La cadena de fecha/hora de análisis con nombre abreviado de zona horaria en Python? (5)

Eso probablemente no funcionará porque esas abreviaturas no son únicas. Vea esta página para más detalles. Puede terminar teniendo que manejarlo usted mismo manualmente si está trabajando con un conjunto conocido de entradas.

Estoy intentando analizar cadenas de marcas de tiempo como "Sat, 11/01/09 8:00PM EST" en Python, pero estoy teniendo problemas para encontrar una solución que maneje la zona horaria abreviada.

Estoy usando la dateutil parse() dateutil , pero no analiza la zona horaria. ¿Hay una forma fácil de hacer esto?


La función parse () en dateutil no puede manejar zonas horarias. Lo que he estado usando es el formateador% Z y la función time.strptime (). No tengo idea de cómo lidia con la ambigüedad en las zonas horarias, pero parece indicar la diferencia entre CDT y CST, que es todo lo que necesitaba.

Antecedentes: almaceno imágenes de respaldo en directorios cuyos nombres son marcas de tiempo usando la hora local, ya que no tengo relojes GMT a mano en casa. Así que uso time.strptime (d, r "% Y-% m-% dT% H:% M:% S_% Z") para analizar los nombres de los directorios nuevamente en un tiempo real para el análisis de edad.


Puede probar el módulo de pytz: http://pytz.sourceforge.net/

pytz trae la base de datos Olson tz a Python. Esta biblioteca permite cálculos de zona horaria precisos y multiplataforma usando Python 2.3 o superior. También resuelve el problema de los tiempos ambiguos al final del horario de verano, sobre los que puede obtener más información en la Referencia de la Biblioteca de Python (datetime.tzinfo).

Casi todas las zonas horarias de Olson son compatibles.


el parser.parse() acepta como argumento clave tzinfos un diccionario del tipo {''EST'': -5*3600} (es decir, que coincide con el nombre de la zona en el desplazamiento GMT en segundos). Asumiendo que tenemos eso, podemos hacer:

>>> import dateutil.parser as dp >>> s = ''Sat, 11/01/09 8:00PM'' >>> for tz_code in (''PST'',''PDT'',''MST'',''MDT'',''CST'',''CDT'',''EST'',''EDT''): >>> dt = s+'' ''+tz_code >>> print dt, ''='', dp.parse(dt, tzinfos=tzd) Sat, 11/01/09 8:00PM PST = 2009-11-01 20:00:00-08:00 Sat, 11/01/09 8:00PM PDT = 2009-11-01 20:00:00-07:00 Sat, 11/01/09 8:00PM MST = 2009-11-01 20:00:00-07:00 Sat, 11/01/09 8:00PM MDT = 2009-11-01 20:00:00-06:00 Sat, 11/01/09 8:00PM CST = 2009-11-01 20:00:00-06:00 Sat, 11/01/09 8:00PM CDT = 2009-11-01 20:00:00-05:00 Sat, 11/01/09 8:00PM EST = 2009-11-01 20:00:00-05:00 Sat, 11/01/09 8:00PM EDT = 2009-11-01 20:00:00-04:00

En cuanto al contenido de tzinfos , así es como tzinfos poblado el mío:

tz_str = ''''''-12 Y -11 X NUT SST -10 W CKT HAST HST TAHT TKT -9 V AKST GAMT GIT HADT HNY -8 U AKDT CIST HAY HNP PST PT -7 T HAP HNR MST PDT -6 S CST EAST GALT HAR HNC MDT -5 R CDT COT EASST ECT EST ET HAC HNE PET -4 Q AST BOT CLT COST EDT FKT GYT HAE HNA PYT -3 P ADT ART BRT CLST FKST GFT HAA PMST PYST SRT UYT WGT -2 O BRST FNT PMDT UYST WGST -1 N AZOT CVT EGT 0 Z EGST GMT UTC WET WT 1 A CET DFT WAT WEDT WEST 2 B CAT CEDT CEST EET SAST WAST 3 C EAT EEDT EEST IDT MSK 4 D AMT AZT GET GST KUYT MSD MUT RET SAMT SCT 5 E AMST AQTT AZST HMT MAWT MVT PKT TFT TJT TMT UZT YEKT 6 F ALMT BIOT BTT IOT KGT NOVT OMST YEKST 7 G CXT DAVT HOVT ICT KRAT NOVST OMSST THA WIB 8 H ACT AWST BDT BNT CAST HKT IRKT KRAST MYT PHT SGT ULAT WITA WST 9 I AWDT IRKST JST KST PWT TLT WDT WIT YAKT 10 K AEST ChST PGT VLAT YAKST YAPT 11 L AEDT LHDT MAGT NCT PONT SBT VLAST VUT 12 M ANAST ANAT FJT GILT MAGST MHT NZST PETST PETT TVT WFT 13 FJST NZDT 11.5 NFT 10.5 ACDT LHST 9.5 ACST 6.5 CCT MMT 5.75 NPT 5.5 SLT 4.5 AFT IRDT 3.5 IRST -2.5 HAT NDT -3.5 HNT NST NT -4.5 HLV VET -9.5 MART MIT'''''' tzd = {} for tz_descr in map(str.split, tz_str.split(''/n'')): tz_offset = int(float(tz_descr[0]) * 3600) for tz_code in tz_descr[1:]: tzd[tz_code] = tz_offset

PD. por @Hank La nomenclatura de la zona horaria gay no está claramente definida. Para formar mi tabla, utilicé http://www.timeanddate.com/library/abbreviations/timezones/ y http://en.wikipedia.org/wiki/List_of_time_zone_abbreviations . Miré cada conflicto y resolví conflictos entre nombres oscuros y populares hacia los populares (más usados). Hubo uno - IST - que no fue tan claro (puede significar tiempo estándar de la India , hora estándar de Irán , hora estándar irlandesa o hora estándar de Israel ), así que lo dejé fuera de la mesa - es posible que tenga que elegir qué agregar para ello basado en su ubicación. Ah, y dejé fuera la República de Kiribati con su absurda "mírame, soy el primero en celebrar Año Nuevo" GMT + 13 y GMT + 14 zonas horarias.


pytz para generar un mapeo TZINFOS :

from datetime import datetime as dt import pytz from dateutil.tz import gettz from pytz import utc from dateutil import parser def gen_tzinfos(): for zone in pytz.common_timezones: try: tzdate = pytz.timezone(zone).localize(dt.utcnow(), is_dst=None) except pytz.NonExistentTimeError: pass else: tzinfo = gettz(zone) if tzinfo: yield tzdate.tzname(), tzinfo

Uso de TZINFOS

>>> TZINFOS = dict(gen_tzinfos()) >>> TZINFOS {''+02'': tzfile(''/usr/share/zoneinfo/Antarctica/Troll''), ''+03'': tzfile(''/usr/share/zoneinfo/Europe/Volgograd''), ''+04'': tzfile(''Europe/Ulyanovsk''), ''+05'': tzfile(''/usr/share/zoneinfo/Indian/Kerguelen''), ... ''WGST'': tzfile(''/usr/share/zoneinfo/America/Godthab''), ''WIB'': tzfile(''/usr/share/zoneinfo/Asia/Pontianak''), ''WIT'': tzfile(''/usr/share/zoneinfo/Asia/Jayapura''), ''WITA'': tzfile(''/usr/share/zoneinfo/Asia/Makassar''), ''WSDT'': tzfile(''/usr/share/zoneinfo/Pacific/Apia''), ''XJT'': tzfile(''/usr/share/zoneinfo/Asia/Urumqi'')}

Uso del parser

>>> date_str = ''Sat, 11/01/09 8:00PM EST'' >>> tzdate = parser.parse(date_str, tzinfos=TZINFOS) >>> tzdate.astimezone(utc) datetime.datetime(2009, 11, 2, 1, 0, tzinfo=<UTC>)

La conversión UTC es necesaria ya que hay muchas zonas horarias disponibles para cada abreviación. Como TZINFOS es un dict , solo tiene la última zona horaria por abreviatura. Y es posible que no obtenga el que esperaba antes de la conversión.

>>> tzdate datetime.datetime(2009, 11, 1, 20, 0, tzinfo=tzfile(''/usr/share/zoneinfo/America/Port-au-Prince''))