具有相同区域设置的不同datetime.strftime输出

时间:2016-01-21 14:38:48

标签: python datetime strftime

我使用的是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')

     

201621января,четверг(月份名称为格式)

关于第二个:

  

('ru_RU','UTF-8')

     

201621Январь,Четверг(月份名称为不定式)

正如您所看到的,大写/小写字母也存在一些差异。在两种情况下,PYTHONIOENCODING都设置为utf_8。

这种行为的原因是什么,更重要的是有没有办法让第二个环境按照第一个环境的方式工作?

2 个答案:

答案 0 :(得分:2)

您正在查看此处C strftime() call的输出; Python代表它。该函数从存储在Python控件之外的语言环境文件中选取这些字符串。

有关文件格式的说明,请参阅locale man page;您正在寻找LC_TIME monday列表。

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

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

由于这是操作系统和系统特定的,如果您需要这些字符串在不同平台上保持一致,则必须使用不同的系统来格式化日期。

如果您尝试解析日期字符串,那么您将无法使用datetimetime模块。请改为使用dateparser projectunderstands 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)

答案 1 :(得分:0)

Python datetime.strftime wraps time.strftime,后者delegates to the underlying C's strftime(3)。显然,这就是它的回报。