【问题标题】:Python's datetime strptime() inconsistent between machinesPython 的日期时间 strptime() 在机器之间不一致
【发布时间】:2014-11-04 14:42:45
【问题描述】:

我被难住了。我编写的日期清理函数在我的 Mac 上的 Python 2.7.5 中工作,但在我的 Ubuntu 服务器上的 2.7.6 中不工作。

Python 2.7.5 (default, Mar  9 2014, 22:15:05) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> date = datetime.strptime('2013-08-15 10:23:05 PDT', '%Y-%m-%d %H:%M:%S %Z')
>>> print(date)
2013-08-15 10:23:05

为什么这在 Ubuntu 上的 2.7.6 中不起作用?

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> date = datetime.strptime('2013-08-15 10:23:05 PDT', '%Y-%m-%d %H:%M:%S %Z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2013-08-15 10:23:05 PDT' does not match format '%Y-%m-%d %H:%M:%S %Z'

编辑:我尝试使用带有小写 %z 的时区偏移量,但仍然出现错误(虽然不同):

>>> date = datetime.strptime('2013-08-15 10:23:05 -0700', '%Y-%m-%d %H:%M:%S %z')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 317, in _strptime
    (bad_directive, format))
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S %z'

【问题讨论】:

  • 只是为了缩小范围,同一台机器还是不同机器?
  • 哦,刚刚注意到不同的操作系统,很明显不同的机器。
  • 两台机器是否都在时区为 PDT 的语言环境中?如果机器的本地时区名称是 PDT,%Z 将仅匹配 PDT
  • docs.python.org/2/library/time.html#time.strptime 说“对 %Z 指令的支持基于 tzname 中包含的值以及日光是否为真。因此,它是特定于平台的,除了识别 UTC 和 GMT 是总是已知的(并且被认为是非夏令时时区)。”这可能会有所启发。
  • @NicoleWhite:解析时区缩写是有问题的,因为它们没有唯一地指定时区。例如,EST 可以表示美国东部标准时间,也可以表示澳大利亚东部夏令时间。 (更多信息,链接,here

标签: python datetime timezone cross-platform python-dateutil


【解决方案1】:

时区缩写不明确。 For example,EST 可以表示东部标准 美国的时间,或者它可能意味着澳大利亚的东部夏令时间。

因此,包含时区缩写的日期时间字符串不能 可靠地解析为时区感知的日期时间对象。

strptime'%Z' 格式将仅匹配 UTC、GMT 或时区缩写 在time.tzname 中列出,这取决于机器语言环境。

如果您可以将日期时间字符串更改为包含 UTC 偏移量的字符串,那么 您可以使用dateutil 将字符串解析为可识别时区的日期时间对象:

import dateutil
import dateutil.parser as DP
date = DP.parse('2013-08-15 10:23:05 -0700')
print(repr(date))
# datetime.datetime(2013, 8, 15, 10, 23, 5, tzinfo=tzoffset(None, -25200))

【讨论】:

  • 谢谢。用你的方法和str.replace('PDT', '-0700')我很高兴。
【解决方案2】:

%Z 将只接受 GMT、UTC 和 time.tzname 中列出的任何内容,因为时区功能是特定于平台的,正如 here 所给出的那样:

对 %Z 指令的支持基于 tzname 以及日光是否为真。正因为如此,它是 特定于平台,除了识别 UTC 和 GMT 始终 已知(并且被认为是非夏令时时区)。

因此,请尝试通过运行以下命令来确定您的平台支持哪些时区:

import time
time.tzname

我得到以下信息:

('PST', 'PDT')

因此,您最好的选择可能是事先将您的时间转换为默认允许的时区之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2021-11-28
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多