【问题标题】:Unexpected strftime() behaviour on Python and macOSPython 和 macOS 上的意外 strftime() 行为
【发布时间】:2018-02-02 16:13:56
【问题描述】:

我的行为与 datetime.strftime() 的输出不一致。

我使用的是 macOS Sierra 10.12.6 和 Python 3.6.2。我有一个Python程序,名为wut.py,即

#!/usr/bin/python
from datetime import datetime
import locale
if __name__ == "__main__":
    print(locale.getlocale())
    print(datetime.today().strftime('%c'))

在终端中,我写

$ date
Gio 24 Ago 2017 18:54:01 CEST

这是意大利人写日期的方式。那么

$ python3 ~/Desktop/wut.py 
('it_IT', 'UTF-8')
Thu Aug 24 18:54:03 2017

日期和时间是在另一个语言环境中写入的。这是怎么回事?这是一个错误还是有任何原因导致这种行为?

我很困惑,因为 Python 文档提到 %c 指的是“区域设置的适当日期和时间表示。”,所以我认为系统的区域设置是“适当的”;)(参见https://docs.python.org/3/library/datetime.html,秒8.1.8)

【问题讨论】:

  • 我知道这不能回答问题,但你说你正在使用 python3 但你的 shebang 调用 python 2... 应该是 #!/usr/bin/python3
  • 你能看到C strftime给你什么吗?我认为 Python 最终会委托给 C strftime 来处理这个问题。
  • @AllenMoh 谢谢,你说得对,我已经修好了。无论如何,它应该不会改变上面的例子
  • 如果您“显式”设置语言环境以使用带有locale.setlocale(locale.LC_ALL, '') 的系统语言环境,您将获得预期的意大利语输出。我不知道为什么这似乎是必要的。
  • @user2357112 我怎样才能看到 C 函数给了我什么? man strftime 只是说 %c is replaced by national representation of time and date.the strftime() function uses the current locale

标签: python python-3.x macos-sierra strftime


【解决方案1】:

有许多不同的语言环境类别都是独立配置的,locale.getlocale() 只能让您获得LC_CTYPE 类别的设置。时间格式由LC_TIME 类别控制,您可以通过locale.getlocale(locale.LC_TIME) 进行检查。

您可以使用locale.setlocale(locale.LC_ALL, '') 将所有区域设置类别的设置设置为用户的默认设置(通常在LANG 环境变量中指定)。 setlocale 不是线程安全的,所以这通常在程序开始附近进行。

【讨论】:

    【解决方案2】:

    深入研究locale模块,我在getdefaultlocale()的描述下找到了这个:

    根据 POSIX,一个没有调用的程序 setlocale(LC_ALL, "") 使用可移植的“C”语言环境运行。 调用 setlocale(LC_ALL, "") 让它使用默认语言环境作为 由 LANG 变量定义。既然我们不想干涉 使用当前的语言环境设置,我们可以模拟行为 以上述方式。

    据此,我认为打电话是个好习惯

    locale.setlocale(locale.LC_ALL, '')
    

    将您的语言环境设置为您希望从调用者的环境继承的语言环境。这样做,您应该会从strftime 获得预期的输出。


    也就是说,在我的 macOS 10.12 安装中,我注意到 Python 2.7 和 Python 3.6 之间的行为有所不同。在启动时,locale.getdefaultlocale()locale.getlocale() 在 Python 3 中都返回 ('en_US', 'UTF-8')。但在 Python 2 中,getlocale() 返回 (None, None),直到我调用 setlocale。在任何一种情况下,strftime 仍然需要调用setlocale 才能实际使用设置的语言环境,而不是默认的C 语言环境。我不知道这是否代表一个错误,或者如果是,那么哪个是错误实例。

    【讨论】:

    • 感谢您的回答,我对 python3 中 locale.getlocale() 的行为感到困惑,即使您尚未设置任何语言环境,它也会返回非空值。
    【解决方案3】:

    python结果正确,strftime('%c')返回相同的结果格式。

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2022-01-12
      • 2021-11-28
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多