Использование dateutil.parser для анализа даты на другом языке

Dateutil – отличный инструмент для синтаксического анализа дат в строковом формате. например

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

возвращается

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

Однако,

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

дает эту ошибку:

 ValueError: unknown string format 

Кто-нибудь знает, как сделать dateutil осведомленным о локали?

Насколько я понимаю, dateutil не знает локали (пока!).

Я могу подумать о трех альтернативных предложениях:

  • Имена дня и месяца жестко закодированы в dateutil.parser (как часть класса parserinfo ). Вы можете подклассифицировать parserinfo и заменить эти имена соответствующими именами для португальского.

  • Измените дату, чтобы получить имена дня и месяца на основе локали пользователя. Таким образом, вы можете сделать что-то вроде

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

    Я начал вилку, которая получает имена из модуля calendar (который является локальным) для работы над этим: https://github.com/alexwlchan/dateutil

    Сейчас он работает на португальском (или кажется), но я хочу подумать об этом немного больше, прежде чем я отправлю патч в основную ветку. В частности, странность может произойти, если она сталкивается с персонажами, которые не используются на западноевропейских языках. Я еще не тестировал это. (См. https://stackoverflow.com/a/8917539/1558022 )

  • Если вы не привязаны к модулю dateutil, вместо этого вы можете использовать datetime, которое уже поддерживает локаль:

     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") 

    (Обратите внимание, что токен %z не поддерживается последовательно в datetime .)

Вы можете использовать PyICU для анализа локализованной строки даты / времени в заданном формате :

 #!/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) 

Он работает на Python 2/3. Он не изменяет глобальное состояние (локаль).

Если ваша фактическая строка времени ввода не содержит явное смещение utc, вы должны указать часовой пояс, который будет использоваться ICU явно, иначе вы можете получить неверный результат (ICU и datetime могут использовать разные определения часового пояса).

Если вам нужно только поддерживать Python 3, и вы не возражаете с установкой языка, вы можете использовать datetime.strptime() поскольку @alexwlchan предположил :

 #!/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