2010-08-09 124 views
3

我有一个日期时间对象,我希望根据OS语言环境设置创建日期字符串(例如,在Windows'7区域和语言设置中指定)。Python:使用%x(语言环境)格式化的日期与预期不符

以下Python的datetime formatting documentation,我用这应该输出“语言环境的适当的日期表示。”的%x格式代码。我期望这个“表示”是Windows“短日期”或“长日期”格式,但它不是一个。 (我已经短日期格式设置为d/MM/yyyy和长日期格式dddd d MMMM yyyy,但输出dd/MM/yy

什么是错在这里:Python文档,Python实现,还是我的期望呢? (以及如何解决?)

回答

7

阅读setlocale() documentation后,我理解的是默认的操作系统区域设置不使用Python作为默认语言环境。要使用它,我不得不开始我的模块有:

import locale 
locale.setlocale(locale.LC_ALL, '') 

或者,如果你打算只重置区域的时间设置,因为它打破少很多事情只使用LC_TIME

import locale 
locale.setlocale(locale.LC_TIME, '') 

肯定这会有一个合理的理由,但至少可以在Python文档中为%x指令提到这一点。

+0

来自https://wiki.debian.org/Locale:“强烈建议不要使用LC_ALL,因为它会覆盖所有内容,请仅在测试时使用,并且不要将其设置为启动文件。” – dstonek 2018-03-07 18:49:20

5

您的语言环境是否在您的脚本中设置?如果您致电locale.getlocale(),结果是否是预期的?以下比较:

>>> import locale 
>>> locale.getlocale() 
(None, None) 
>>> import datetime 
>>> today = datetime.date.today() 
>>> today 
datetime.date(2010, 8, 9) 
>>> today.strftime('%x') 
'08/09/10' 
>>> locale.setlocale(locale.LC_ALL, "de_DE.UTF-8") 
'de_DE.UTF-8' 
>>> locale.getlocale() 
('de_DE', 'UTF8') 
>>> today.strftime('%x') 
'09.08.2010' 

需要注意的是有缺陷的datetime模块中,因为在底层的C库错误的居多。例如,在我的安装(最新的OS X)上,格式化字符串%z完全不可用。

在Windows上,可用于setlocale()的语言环境字符串的语法遵循与* nix平台上不同的语法。列表是here on MSDN

如果您只是希望将您的脚本设置为用户安装的任何默认语言环境(在我的英国英语中),则只需在主脚本的开头执行此操作即可。不这样做的模块,因为它覆盖了一个全局变量:

>>> locale.setlocale(locale.LC_ALL, "") 
'en_GB.UTF-8' 
相关问题