Python: дата отформатирована с% x (локаль) не так, как ожидалось - PullRequest
3 голосов
/ 09 августа 2010

У меня есть объект datetime, для которого я хочу создать строку даты в соответствии с настройками локали ОС (как указано, например, в настройках региона и языка Windows'7).

Следуя документации Python по форматированию даты и времени , я использовал код формата %x, который должен выводить " соответствующее представление даты в локали. ". Я ожидаю, что это «представление» будет либо в формате «короткая дата» Windows, либо в формате «длинная дата», но это не тот формат. (У меня установлен формат короткой даты d/MM/yyyy, а формат длинной даты dddd d MMMM yyyy, но вывод dd/MM/yy)

Что здесь не так: документация по Python, реализация Python или мои ожидания? (и как исправить?)

Ответы [ 2 ]

7 голосов
/ 09 августа 2010

После прочтения документации setlocale () я понял, что языковой стандарт ОС по умолчанию не используется Python в качестве языкового стандарта по умолчанию. Чтобы использовать его, мне пришлось запустить мой модуль с:

import locale
locale.setlocale(locale.LC_ALL, '')

В качестве альтернативы, если вы намереваетесь сбросить только настройки времени для локали, используйте LC_TIME, так как это ломает гораздо меньше вещей:

import locale
locale.setlocale(locale.LC_TIME, '')

Конечно, для этого будет веская причина, но, по крайней мере, это можно было бы упомянуть в качестве примечания в документации по Python для директивы% x.

5 голосов
/ 09 августа 2010

Ваш язык установлен в вашем скрипте? Если вы позвоните locale.getlocale(), ожидается ли результат? Сравните ниже:

>>> import locale
>>> locale.getlocale()
(None, None)
>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2010, 8, 9)
>>> today.strftime('%x')
'08/09/10'
>>> locale.setlocale(locale.LC_ALL, "de_DE.UTF-8")
'de_DE.UTF-8'
>>> locale.getlocale()
('de_DE', 'UTF8')
>>> today.strftime('%x')
'09.08.2010'

Обратите внимание, что в модуле datetime есть ошибки, в основном из-за ошибок в базовых C-библиотеках. Например, в моей установке (последняя версия OS X) строка форматирования %z полностью недоступна.

В Windows синтаксис строк локали, доступных для setlocale(), соответствует синтаксису, отличному от * nix-платформ. Список здесь на MSDN .

И если вы просто хотите установить в своем скрипте ту локаль по умолчанию, которую установили ваши пользователи (на моем: английский английский), вы просто делаете это в начале основного скрипта. Не делайте этого в модулях, так как это переопределяет глобальную переменную:

>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
...