具有相同区域设置的不同 datetime.strftime 输出
Different datetime.strftime output with same locale settings
我使用 python 2.7 结果发现 datetime.strftime 在具有相同区域设置的不同环境(均基于 unix)上产生不同的输出。
locale.setlocale(locale.LC_ALL, ('RU', 'utf-8'))
print locale.getlocale()
print datetime.date.today().strftime("%Y %d %B, %A")
在第一个环境中我得到:
('ru_RU', 'UTF-8')
2016 21 января, четверг (month name is in genitive form)
第二次:
('ru_RU', 'UTF-8')
2016 21 Январь, Четверг (month name is in infinitive form)
如您所见,upper/lowercase 个字母也有一些差异。在这两种情况下,PYTHONIOENCODING 都设置为 utf_8。
这种行为的原因是什么,更重要的是有没有办法让第二个环境像第一个环境一样工作?
您正在查看 C strftime()
call 的输出; Python 委托给它。该函数从存储在 Python.
控制范围之外的语言环境文件中选取这些字符串
文件格式的描述见locale
man page;您正在寻找 LC_TIME
mon
和 day
列表。
On Mac OS X 存储的东西略有不同,文件存储在 /usr/share/locale/
;对于 ru_RU
时间定义,有一个名为 /usr/share/locale/ru_RU.UTF-8/LC_TIME
的文件;它按特定顺序每行放置一个值。例如,前 24 行是月份(缩写和完整);完整的月份名称定义为:
января
февраля
марта
апреля
мая
июня
июля
августа
сентября
октября
ноября
декабря
因为这是 OS 和系统特定的,如果您需要这些字符串在不同平台上保持一致,您必须完全使用不同的系统来格式化日期。
如果您尝试解析 一个日期字符串,您将无法使用datetime
或time
模块。试试 dateparser
project instead, which understands the different Russian forms:
>>> import dateparser
>>> dateparser.parse(u'2016 21 января, четверг')
datetime.datetime(2016, 1, 21, 0, 0)
>>> dateparser.parse(u'2016 21 Январь, Четверг')
datetime.datetime(2016, 1, 21, 0, 0)
Python 的 datetime.strftime
wraps time.strftime
, and the latter delegates to the underlying C's strftime(3)
。显然,就是这样 returns.
我使用 python 2.7 结果发现 datetime.strftime 在具有相同区域设置的不同环境(均基于 unix)上产生不同的输出。
locale.setlocale(locale.LC_ALL, ('RU', 'utf-8'))
print locale.getlocale()
print datetime.date.today().strftime("%Y %d %B, %A")
在第一个环境中我得到:
('ru_RU', 'UTF-8')
2016 21 января, четверг (month name is in genitive form)
第二次:
('ru_RU', 'UTF-8')
2016 21 Январь, Четверг (month name is in infinitive form)
如您所见,upper/lowercase 个字母也有一些差异。在这两种情况下,PYTHONIOENCODING 都设置为 utf_8。
这种行为的原因是什么,更重要的是有没有办法让第二个环境像第一个环境一样工作?
您正在查看 C strftime()
call 的输出; Python 委托给它。该函数从存储在 Python.
文件格式的描述见locale
man page;您正在寻找 LC_TIME
mon
和 day
列表。
On Mac OS X 存储的东西略有不同,文件存储在 /usr/share/locale/
;对于 ru_RU
时间定义,有一个名为 /usr/share/locale/ru_RU.UTF-8/LC_TIME
的文件;它按特定顺序每行放置一个值。例如,前 24 行是月份(缩写和完整);完整的月份名称定义为:
января
февраля
марта
апреля
мая
июня
июля
августа
сентября
октября
ноября
декабря
因为这是 OS 和系统特定的,如果您需要这些字符串在不同平台上保持一致,您必须完全使用不同的系统来格式化日期。
如果您尝试解析 一个日期字符串,您将无法使用datetime
或time
模块。试试 dateparser
project instead, which understands the different Russian forms:
>>> import dateparser
>>> dateparser.parse(u'2016 21 января, четверг')
datetime.datetime(2016, 1, 21, 0, 0)
>>> dateparser.parse(u'2016 21 Январь, Четверг')
datetime.datetime(2016, 1, 21, 0, 0)
Python 的 datetime.strftime
wraps time.strftime
, and the latter delegates to the underlying C's strftime(3)
。显然,就是这样 returns.