Python:使用%x(语言环境)格式化的日期不符合预期

时间:2010-08-09 07:35:34

标签: python datetime internationalization locale

我有一个datetime对象,我想根据操作系统区域设置创建一个日期字符串(例如在Windows'7区域和语言设置中指定)。

在Python的datetime formatting documentation之后,我使用了%x格式代码,该代码应该输出“ Locale的相应日期表示。”。我希望这种“表示”可以是Windows“短日期”或“长日期”格式,但它不是任何一种。 (我将短日期格式设置为d/MM/yyyy,将长日期格式设置为dddd d MMMM yyyy,但输出为dd/MM/yy

这里有什么问题:Python文档,Python实现或我的期望? (以及如何解决?)

2 个答案:

答案 0 :(得分:7)

在阅读setlocale() documentation之后,我明白Python没有使用默认的OS语言环境作为默认语言环境。要使用它,我必须启动我的模块:

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

或者,如果您只想重置区域设置的时间设置,请仅使用LC_TIME,因为它可以减少很少的内容:

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

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

答案 1 :(得分: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'