Попытка отобразить локализованную строку даты в текстовом графическом виджете.Подход, который я сейчас использую, заключается в отображении локализованной строки с 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