我使用的是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。
这种行为的原因是什么,更重要的是有没有办法让第二个环境按照第一个环境的方式工作?
答案 0 :(得分:2)
您正在查看此处C strftime()
call的输出; Python代表它。该函数从存储在Python控件之外的语言环境文件中选取这些字符串。
有关文件格式的说明,请参阅locale
man page;您正在寻找LC_TIME
mon
和day
列表。
在Mac OS X上存储的内容略有不同,文件存储在/usr/share/locale/
;对于ru_RU
时间定义,有一个名为/usr/share/locale/ru_RU.UTF-8/LC_TIME
的文件;它按特定顺序每行输入一个值。前24行是月(缩写和完整),例如;将完整的月份名称定义为:
января
февраля
марта
апреля
мая
июня
июля
августа
сентября
октября
ноября
декабря
由于这是操作系统和系统特定的,如果您需要这些字符串在不同平台上保持一致,则必须使用不同的系统来格式化日期。
如果您尝试解析日期字符串,那么您将无法使用datetime
或time
模块。请改为使用dateparser
project,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)
答案 1 :(得分:0)
Python datetime.strftime
wraps time.strftime
,后者delegates to the underlying C's strftime(3)
。显然,这就是它的回报。