【问题标题】:Parsing time string in Python在 Python 中解析时间字符串
【发布时间】:2012-05-16 16:23:19
【问题描述】:

我有一个日期时间字符串,我不知道如何在 Python 中解析它。

字符串是这样的:

Tue May 08 15:14:45 +0800 2012

我试过了

datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y")

但是 Python 提出了

'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y'

根据 Python 文档:

%z UTC 偏移量,格式为 +HHMM 或 -HHMM(如果对象是 naive 则为空字符串)。

解析这个时间字符串的正确格式是什么?

【问题讨论】:

标签: python datetime datetime-parsing


【解决方案1】:

datetime.datetime.strptime 存在时区解析问题。看看dateutil package

>>> from dateutil import parser
>>> parser.parse("Tue May 08 15:14:45 +0800 2012")
datetime.datetime(2012, 5, 8, 15, 14, 45, tzinfo=tzoffset(None, 28800))

【讨论】:

  • @zidarsk8 试试这个:parser.parse("02/Nov/2012:06:37:42 +0000",fuzzy=True) - 指定模糊,解析器会忽略它不理解的字符。
  • 这实际上解析了错误的日期。 Fri Nov 9 09:04:02 2012 -0500 忽略 -0500 并使用当前时区。
  • 命令是“pip install python-dateutil”使用pip btw安装它。
  • 小心——使用这个库我也得到了不正确的结果,月份和日期颠倒了! 19.01.2017 => 一月,12.01.2017=>十二月
  • @eumiro 我刚刚提议对您的答案进行编辑,但我的编辑错误,我不知道如何取消编辑。请拒绝。
【解决方案2】:

最好的办法是查看strptime()

类似的东西

>>> from datetime import datetime
>>> date_str = 'Tue May 08 15:14:45 +0800 2012'
>>> date = datetime.strptime(date_str, '%a %B %d %H:%M:%S +0800 %Y')
>>> date
datetime.datetime(2012, 5, 8, 15, 14, 45)

不幸的是,我不确定如何使用 +0800 时区,也许其他人可以帮助解决这个问题。

格式化字符串可在http://docs.python.org/library/time.html#time.strftime 找到,与格式化字符串打印相同。

希望有帮助

标记

PS,从 pypi 安装 pytz 时区的最佳选择。 (http://pytz.sourceforge.net/) 事实上,如果我没记错的话,我认为 pytz 有一个很棒的日期时间解析方法。带有时区功能的标准库有点薄。

【讨论】:

  • eumiro 提到 datetime.datetime.strptime 存在时区解析问题。我觉得是真的
【解决方案3】:

这是一个支持输入时间字符串中的可变 utc 偏移量的 stdlib 解决方案:

>>> from email.utils import parsedate_tz, mktime_tz
>>> from datetime import datetime, timedelta
>>> timestamp = mktime_tz(parsedate_tz('Tue May 08 15:14:45 +0800 2012'))
>>> utc_time = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
>>> utc_time
datetime.datetime(2012, 5, 8, 7, 14, 45)

【讨论】:

  • 这很可靠!例如,我的字符串有“GMT-0500”,parsedate_tz 似乎与“GMT”混淆了,但很快.replace("GMT", "") 就完美了!
【解决方案4】:

在 SO 中已经讨论过很多次了。简而言之,不支持“%z”,因为平台不支持。 我的解决方案是新的,跳过时区即可。:

    datetime.datetime.strptime(re.sub(r"[+-]([0-9])+", "", "Tue May 08 15:14:45 +0800 2012"),"%a %b %d %H:%M:%S %Y")

【讨论】:

  • 您的解决方案仍然中断,只是不会引发错误。
【解决方案5】:
In [117]: datetime.datetime.strptime?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in method strptime of type object at 0x9a2520>
Namespace:      Interactive
Docstring:
    string, format -> new datetime parsed from a string (like time.strptime()).

【讨论】:

  • 我尝试了datetime.strptime("Tue May 08 15:14:45 +0800 2012","%a %b %d %H:%M:%S %z %Y"),但 Python 引发了'z' is a bad directive in format '%a %b %d %H:%M:%S %z %Y'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
相关资源
最近更新 更多