具有相同区域设置的不同 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 monday 列表。

On Mac OS X 存储的东西略有不同,文件存储在 /usr/share/locale/;对于 ru_RU 时间定义,有一个名为 /usr/share/locale/ru_RU.UTF-8/LC_TIME 的文件;它按特定顺序每行放置一个值。例如,前 24 行是月份(缩写和完整);完整的月份名称定义为:

января
февраля
марта
апреля
мая
июня
июля
августа
сентября
октября
ноября
декабря

因为这是 OS 和系统特定的,如果您需要这些字符串在不同平台上保持一致,您必须完全使用不同的系统来格式化日期。

如果您尝试解析 一个日期字符串,您将无法使用datetimetime 模块。试试 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.