В некоторых локалях сбой time.strptime (today.strftime ("% x"), "% x") - PullRequest
2 голосов
/ 10 октября 2011

Попытка отобразить локализованную строку даты в текстовом графическом виджете.Подход, который я сейчас использую, заключается в отображении локализованной строки с datetime.datetime.strftime ("% x") в текстовый виджет, чтобы пользователь мог ее редактировать.Затем я пытаюсь разобрать строку с помощью time.strptime ("x").

В настоящее время проблема заключается в том, что для некоторых локалей (or_IN, ja_JP.UTF-8, ko_KO.UTF-8) time.strptime ("x") не может проанализировать формат, сгенерированный datetime.datetime.strftime("%Икс").Всегда выдает ValueError, пытаясь разобрать это.

Я подозреваю, что это проблема с strptime и строками даты, которые используют двухбайтовые разделители в формате даты.Это также может быть проблемой из-за различий в том, что% x означает для strftime и strptime (если я правильно понимаю, одна из них - это просто реализация glibc, в то время как другая специфична для python).

Я ищу лучший подход к обработке локализованных строк дат, чтобы их можно было редактировать в пользовательском интерфейсе.

#!/usr/bin/python


# We are trying to present a localized date in a text widget, so
# that a user could potentially edit it, and then we try to
# parse it with datetime.strptime

# however, even if the user doesn't edit the date produced
# by today.strftime("%x"), time.strptime(DATE, "%x") fails
# to parse it

# Not sure what's going on there before. I've seen this once
# before with in_OR, and that turned out to be a locale bug
# in glibc. This could also be the case, so what I'm looking
# for is a more robust approach to this problem that will
# work on all locales

# platform: fedora 14, x86_64
# Python 2.7 (r27:82500, Sep 16 2010, 18:02:00) 
# [GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2

import datetime
import time
import locale

today = datetime.date.today()

# works for "C"
locale.setlocale(locale.LC_ALL, 'C')
print time.strptime(today.strftime("%x"), "%x")

# works for en_us.utf8
locale.setlocale(locale.LC_ALL, 'en_US.utf8')
print time.strptime(today.strftime("%x"), "%x")


# fails for 'ja_JP.UTF-8'
loc = 'ja_JP.UTF-8'
locale.setlocale(locale.LC_ALL,loc)
try:
    print today.strftime("%x")
    print time.strptime(today.strftime("%x"), "%x")
except ValueError:
    print "failed for %s" % loc


loc = 'ko_KR.UTF-8'
locale.setlocale(locale.LC_ALL,loc)
try:
    print today.strftime("%x")
    print time.strptime(today.strftime("%x"), "%x")
except ValueError:
    print "failed for %s" % loc

И пример вывода этой тестовой программы на моей системе (fedora 14, x86_64):

time.struct_time(tm_year=2011, tm_mon=10, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=283, tm_isdst=-1)
time.struct_time(tm_year=2011, tm_mon=10, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=283, tm_isdst=-1)
2011年10月10日
failed for ja_JP.UTF-8
2011년 10월 10일
failed for ko_KR.UTF-8

Ответы [ 3 ]

0 голосов
/ 10 октября 2011

Используйте виджет даты вашего инструментария вместо текстового виджета.Все основные наборы инструментов имеют виджет даты, который просто работает, и его гораздо проще редактировать, чем текстовое поле с любым представлением даты.

0 голосов
/ 30 января 2013

В конце концов, просто изменили текстовую запись для даты, чтобы использовать формат даты iso, аля: 2013-12-31. Это немного раздражает в другом прекрасном локализованном интерфейсе, но увы.

В данном конкретном случае родной инструментарий не предоставил текстовую дату Сценарий ввода и использования делает поиск по датам в будущем обычным (имеется в виду десятки кликов в виджете календаря GUI).

Другие подобные вариации этой проблемы также привели к этому изменению. Для нескольких регионов, особенно локали, которые использовали формат даты с названиями месяцев, которые будут меняться с одиночный глиф к имени с двумя символами, встроенный в Python strptime потерпит неудачу, даже с правильным языком, и иначе правильно отформатированными строками. Для бонуса Обострение, в некоторых регионах, он потерпит неудачу, только если месяц> 10, так что это будет работа кроме ноября / дек. Для других локалей это был glibc strptime, который потерпеть поражение. Поданные ошибки для обоих случаев существуют в апстриме.

0 голосов
/ 10 октября 2011

Проверьте, есть ли у вас ваши локали в locale_alias словарь

>>> import locale
>>> len(locale.locale_alias)
843
>>> locale.locale_alias.keys()[:10]
['ko_kr.euc', 'is_is', 'ja_jp.mscode', 'kw_gb@euro', 'yi_us.cp1255', 'ca_es@euro', 'ja_jp.ujis', 'ar_ma', 'greek.iso88597', 'sr_yu.iso88592']
>>>
...