Почему Python хранит строки немецкого и испанского (и других?) Формата времени как% T в модуле локали? - PullRequest
8 голосов
/ 26 августа 2011

Я пишу тест для программы, которая будет использоваться в нескольких локалях. При выполнении теста на немецком языке я получил ошибку

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/local/lib/python2.7/_strptime.py", line 317, in _strptime
    (bad_directive, format))
ValueError: 'T' is a bad directive in format '%T'

Углубившись в это, я обнаружил, что при использовании locale.nl_langinfo(locale.T_FMT) на немецком или испанском (и, возможно, на других языках) получается строка формата '%T'. Это не распознается в модуле time .

В документации по locale на python.org ничего не говорится о возвращении '%T'. Единственная ссылка на '%T', которую я мог найти где-либо, - это ответ на отдельный вопрос StackOverflow . Исходя из этого поста и контекста, я предполагаю, что '%T' является сокращением для '%H:%M:%S'.

У меня вопрос, как мне обработать локали, для которых locale вернет '%T' для его строки формата, не делая что-то вроде

if fmt_str == '%T':
    fmt_str = '%H:%M:%S'

справиться с этими делами?

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Это совершенно неудовлетворительный ответ, но в любом случае это ответ:

Причина, по которой locale и time.strptime плохо сочетаются друг с другом, заключается в том, что форматы locale не были написаны для time.strptime.Они были написаны для time.strftime, чтобы производить необходимые форматы даты / времени, а не анализировать их.

Поскольку time.strptime был написан как независимый от платформы, он не принимает столько директив, сколько выдаёт locale;time.strftime должен иметь возможность преобразовывать все, что ему брошено, поэтому он принимает любую определяемую платформой директиву.

Так что нет, нет более простого способа заставить time и locale взаимодействоватьЯ хочу, чтобы они.

0 голосов
/ 29 августа 2011

На самом деле я вижу, что вы используете strptime , а не strftime .И документация для strptime упоминает:

Поддерживаются только директивы, указанные в документации.Поскольку strftime () реализован для каждой платформы, он может иногда предлагать больше директив, чем перечислено.Но strptime () не зависит от какой-либо платформы и, следовательно, не обязательно поддерживает все доступные директивы, которые не документированы как поддерживаемые.

Как предлагается здесь , вы можете использовать более мощнуюанализатор даты, например dateutil

>> import dateutil.parser
>> dateutil.parser.parse("Thu Sep 25 10:36:28 2003")
datetime.datetime(2003, 9, 25, 10, 36, 28)
...