【问题标题】:Why does Python store German and Spanish (and other?) time format strings as %T in the locale module?为什么 Python 在语言环境模块中将德语和西班牙语(以及其他?)时间格式字符串存储为 %T?
【发布时间】:2011-08-25 20:15:24
【问题描述】:

我正在为将在多个语言环境中使用的程序编写测试。在用德语运行测试时,我得到了错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/_strptime.py", line 454, in _strptime_time
    return _strptime(data_string, format)[0]
  File "/usr/local/lib/python2.7/_strptime.py", line 317, in _strptime
    (bad_directive, format))
ValueError: 'T' is a bad directive in format '%T'

深入研究后,我发现在德语或西班牙语(可能还有其他语言)中使用locale.nl_langinfo(locale.T_FMT) 会产生格式字符串'%T'。这在time module 中无法识别。

python.orglocale 上的文档没有提到任何关于返回 '%T' 的内容。我在任何地方都能找到对'%T' 的唯一引用是对a separate StackOverflow question 的回复。从那篇文章和上下文来看,我假设'%T''%H:%M:%S' 的简写。

我的问题是,我如何处理 locale 将为其格式字符串返回 '%T' 的语言环境而不做类似的事情

if fmt_str == '%T':
    fmt_str = '%H:%M:%S'

处理那些案件?

【问题讨论】:

  • +1 很奇怪。一个标准模块无条件地出错,带有糟糕的错误消息,仅仅是因为语言环境的变化?
  • 问题似乎是这两个模块只是不相互通信,locale 开始使用time 无法识别的简写。这很奇怪,因为它们都应该遵守 unix date 标准; locale 会,而time 显然不会。
  • 不是我的本地环境支持%T,而是locale使用%T作为%H:%M:%S的简写,而time不支持。 locale 中的缩写与 Unix 的 date 函数的格式相匹配(要查看它们,请在命令行中键入 date --h),但 time 使用精简的缩写列表。作为记录,%X 可以工作,但这不是locale 返回的内容。

标签: python time locale string-formatting


【解决方案1】:

这是一个完全不能令人满意的答案,但无论如何这就是答案:

localetime.strptime 不能很好地配合使用的原因是 locale 格式不是为 time.strptime 编写的。它们是为time.strftime 编写的,用于生成必要的日期/时间格式,而不是解析它们。

因为time.strptime 被编写为独立于平台的,所以它不接受locale 给出的那么多指令; time.strftime 需要能够转换任何扔给它的东西,所以它接受任何平台定义的指令。

所以,不,没有更简单的方法可以让 timelocale 按照我希望的方式合作。

【讨论】:

    【解决方案2】:

    实际上我看到你使用的是strptime,而不是strftime。 strptime 的文档提到:

    仅支持文档中指定的指令。因为 strftime() 是按平台实现的,所以有时它可以提供比所列指令更多的指令。但是 strptime() 独立于任何平台,因此不一定支持所有未记录为支持的可用指令。

    按照here 的建议,您可以使用更强大的日期解析器,例如dateutil

    >> import dateutil.parser
    >> dateutil.parser.parse("Thu Sep 25 10:36:28 2003")
    datetime.datetime(2003, 9, 25, 10, 36, 28)
    

    【讨论】:

    • 不幸的是,dateutil 不是标准模块,或者至少它没有安装在我工作场所的计算机上。 :(
    • 那么,由于 strptime 仅支持 ansi 格式说明符,因此您必须转换所有非标准格式说明符(您可以)。您可以在您的平台上使用 strftime 文档中的列表,例如:linux.die.net/man/3/strftime(并使用 dict 而不是 'if's)
    • 但最好的选择可能是将所有日期存储为 unixtimestamps,并且仅在需要显示它们时使用 strftime 进行转换
    • 是的,我目前只是用合理的、受支持的指令替换不受支持的指令。在您的贡献和更仔细地查看文档之间,我已经回答了我的问题。非常感谢。
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多