5

我试图将字符串转换为日期时间对象。我从新闻提要中获得的字符串格式如下:“Thu, 16 Oct 2014 01:16:17 EDT”

我尝试使用 datetime.strptime() 来转换它。IE,

datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M:%S %Z')

并得到以下错误:

回溯(最后一次调用):
  文件“”,第 1 行,在 datetime.strptime('Thu, 16 Oct 2014 01:16:17 EDT','%a, %d %b %Y %H:%M: %S %Z')
  文件“C:\Anaconda\lib_strptime.py”,第 325 行,在 _strptime(data_string,格式)中)
ValueError:时间数据'Thu,2014 年 10 月 16 日 01:16:17 EDT' 与格式不匹配'%a, %d %b %Y %H:%M:%S %Z'

但是,如果我尝试了没有“EDT”的字符串,它就起作用了。IE,

datetime.strptime('Thu, 16 Oct 2014 01:16:17','%a, %d %b %Y %H:%M:%S')

有谁知道如何解析那个“EDT”部分?

4

2 回答 2

10

要解析RFC 2822 格式的日期,您可以使用email包:

from datetime import datetime, timedelta
from email.utils import parsedate_tz, mktime_tz

timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)

注意:parsedate_tz()假设 EDT 对应于-0400UTC 偏移量,但在 EDT 所在的澳大利亚+1100pytz在这种情况下使用 AEDT)可能不正确,即时区缩写可能不明确。请参阅在 Python 中使用时区缩写名称解析日期/时间字符串?

相关的 Python 错误:strptime 中的 %Z 与 EST 和其他不匹配

如果您的计算机使用 POSIX 时间戳(可能),并且您确定输入日期在您的系统可接受的范围内(未来/过去不会太远),并且您不需要保留微秒精度,那么您可以使用datetime.utcfromtimestamp

from datetime import datetime
from email.utils import parsedate_tz, mktime_tz

timestamp = mktime_tz(parsedate_tz("Thu, 16 Oct 2014 01:16:17 EDT"))
# -> 1413436577
utc_dt = datetime.utcfromtimestamp(timestamp)
# -> datetime.datetime(2014, 10, 16, 5, 16, 17)
于 2014-10-18T01:52:34.517 回答
1

email.utils.parsedate_tz() 解决方案适用于 3 个字母的时区,但不适用于 4 个字母,例如 AEDT 或 CEST。如果您需要混合,请在 Python 中使用时区缩写名称解析日期/时间字符串下的答案?适用于最常用的时区。

于 2021-04-16T16:55:48.013 回答