【问题标题】:ValueError time data 'Fri Mar 11 15:59:57 EST 2016' does not match format '%a %b %d %H:%M:%S %Z %Y'ValueError 时间数据 'Fri Mar 11 15:59:57 EST 2016' 与格式 '%a %b %d %H:%M:%S %Z %Y' 不匹配
【发布时间】:2016-11-06 11:45:30
【问题描述】:

我试图从以下日期简单地创建一个日期时间对象:'Fri Mar 11 15:59:57 EST 2016' 使用格式:'%a %b %d %H:%M:%S %Z %Y'。

这是代码。

from datetime import datetime
date = datetime.strptime('Fri Mar 11 15:59:57 EST 2016', '%a %b %d %H:%M:%S %Z %Y')

但是,这会导致如下所示的 ValueError。

ValueError: time data 'Fri Mar 11 15:59:57 EST 2016' does not match format '%a %b %d %H:%M:%S %Z %Y'

也许我的格式字符串遗漏了一些明显错误的地方,但我已经一遍又一遍地检查它。任何帮助将不胜感激,谢谢。

编辑以反映 cmets/问题以获取更多信息:

我使用的 Python 版本是 2.7.6。

在 Ubuntu 14.04 上使用“locale”命令我得到了这个:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

【问题讨论】:

  • 我试过你的代码,它对我有用;你用的是什么版本的 Python?
  • 我使用的是 Python 2.7.6
  • 您是否有机会使用使用非英语语言环境设置的计算机?
  • 这是“locale”命令的输出。顺便说一下,这是在亚马逊 AWS 上的 ubuntu 14.04 上。 $ locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY=" en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8 " LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
  • 简而言之,回答你的问题,没有。似乎语言环境都设置为 en_US

标签: python datetime strptime


【解决方案1】:

对于 %Z 说明符,strptime 仅识别“UTC”、“GMT”以及 time.tzname 中的任何内容(因此它是否识别“EST”将取决于您计算机的时区)。这是issue 22377

见:

解析包含人类可读时区的时区的最佳选择仍然是使用第三方python-dateutil 库:

import dateutil
date = dateutil.parse('Fri Mar 11 15:59:57 EST 2016')

如果您无法安装 python-dateutil,您可以去掉时区并手动解析它,例如使用字典查找。

【讨论】:

  • 这里也出现了问题。确实,我认为问题出在EST 子字符串上,而您刚刚确认了问题。在这种情况下,是否有任何安全的方法来解析这些字符串并避免此问题?
  • @JeandersonBarrosCândido 最好的选择是使用 python-dateutil。我已经更新了我的答案以添加,谢谢。
  • 就是这样。谢谢!
  • 这个答案仍然是处理datetime 无法处理的时区的最佳方式。
猜你喜欢
  • 2022-01-09
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2022-01-20
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多