【问题标题】:Python: date formatted with %x (locale) is not as expectedPython:使用 %x(语言环境)格式化的日期与预期不符
【发布时间】:2010-08-09 07:35:33
【问题描述】:

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

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

这里出了什么问题:Python 文档、Python 实现,还是我的期望? (以及如何解决?)

【问题讨论】:

    标签: python datetime internationalization locale


    【解决方案1】:

    阅读setlocale() documentation 后,我了解到Python 不使用默认OS 语言环境作为默认语言环境。要使用它,我必须以以下方式开始我的模块:

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

    或者,如果您打算仅重置区域设置的时间设置,请仅使用 LC_TIME,因为它破坏的东西更少:

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

    这肯定是有正当理由的,但至少这可以作为 %x 指令的 Python 文档中的备注提及。

    【讨论】:

    • 来自wiki.debian.org/Locale:“强烈建议不要使用 LC_ALL,因为它会覆盖所有内容。请仅在测试时使用,切勿在启动文件中设置它。”
    【解决方案2】:

    您的语言环境是否已在您的脚本中设置?如果你打电话给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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多