dateutil python date localization internationalization python-dateutil

python - import dateutil



Usar dateutil.parser para analizar una fecha en otro idioma (2)

Podría usar PyICU para analizar una cadena de fecha / hora localizada en un formato dado :

#!/usr/bin/env python # -*- coding: utf-8 -*- from datetime import datetime import icu # PyICU df = icu.SimpleDateFormat( ''EEE, dd MMM yyyy HH:mm:ss zzz'', icu.Locale(''pt_BR'')) ts = df.parse(u''Ter, 01 Out 2013 14:26:00 -0300'') print(datetime.utcfromtimestamp(ts)) # -> 2013-10-01 17:26:00 (UTC)

Funciona en Python 2/3. No modifica el estado global (configuración regional).

Si su cadena de tiempo de entrada real no contiene el desplazamiento utc explícito, debe especificar una zona horaria para ser utilizada por la ICU explícitamente; de ​​lo contrario, puede obtener un resultado incorrecto (ICU y datetime pueden usar diferentes definiciones de zona horaria).

Si solo necesitas admitir Python 3 y no te molesta configurar la configuración regional, puedes usar datetime.strptime() como @alexwlchan sugirió :

#!/usr/bin/env python3 import locale from datetime import datetime locale.setlocale(locale.LC_TIME, "pt_PT.UTF-8") print(datetime.strptime("Ter, 01 Out 2013 14:26:00 -0300", "%a, %d %b %Y %H:%M:%S %z")) # works on Python 3.2+ # -> 2013-10-01 14:26:00-03:00

Dateutil es una gran herramienta para analizar fechas en formato de cadena. por ejemplo

from dateutil.parser import parse parse("Tue, 01 Oct 2013 14:26:00 -0300")

devoluciones

datetime.datetime(2013, 10, 1, 14, 26, tzinfo=tzoffset(None, -10800))

sin embargo,

parse("Ter, 01 Out 2013 14:26:00 -0300") # In portuguese

produce este error:

ValueError: unknown string format

¿Alguien sabe cómo hacer que dateutil esté al tanto de la configuración regional?


Por lo que puedo ver, dateutil no es consciente de la configuración regional (¡aún!).

Puedo pensar en tres sugerencias alternativas:

  • Los nombres de día y mes están codificados en dateutil.parser (como parte de la clase parserinfo ). Podría subclase parserinfo y reemplazar estos nombres con los nombres apropiados para portugués.

  • Modifique dateutil para obtener nombres de días y meses según la configuración regional del usuario. Entonces podrías hacer algo como

    import locale locale.setlocale(locale.LC_ALL, "pt_PT") from dateutil.parser import parse parse("Ter, 01 Out 2013 14:26:00 -0300")

    Empecé un fork que obtiene los nombres del módulo de calendar (que tiene en cuenta la configuración regional) para trabajar en esto: https://github.com/alexwlchan/dateutil

    En este momento funciona para portugués (o parece), pero quiero pensarlo un poco más antes de enviar un parche a la rama principal. En particular, la rareza puede ocurrir si se enfrenta a caracteres que no se utilizan en los idiomas de Europa occidental. No he probado esto todavía. (Ver https://.com/a/8917539/1558022 )

  • Si no está vinculado al módulo dateutil, podría usar datetime en su lugar, que ya es compatible con la configuración regional:

    from datetime import datetime, date import locale locale.setlocale(locale.LC_ALL, "pt_PT") datetime.strptime("Ter, 01 Out 2013 14:26:00 -0300", "%a, %d %b %Y %H:%M:%S %z")

    (Tenga en cuenta que el token %z no es compatible sistemáticamente en fecha y hora ).