如何将带时区缩写的字符串转换为日期时间对象?

7 投票
2 回答
2634 浏览
提问于 2025-04-28 05:29

我在尝试把一个字符串转换成日期时间对象。

我从新闻源得到的字符串格式是这样的:

Thu, 16 Oct 2014 01:16:17 EDT"

我试着用 datetime.strptime() 来转换它。

也就是说,

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, format)
值错误:时间数据 'Thu, 16 Oct 2014 01:16:17 EDT' 与格式 '%a, %d %b %Y %H:%M:%S %Z' 不匹配

不过,如果我去掉 "EDT" 的话,就能成功转换。

也就是说,

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

有没有人知道怎么处理这个 "EDT" 部分呢?

暂无标签

2 个回答

1

email.utils.parsedate_tz() 这个方法适合处理三字母的时区,比如 EST 或 GMT,但对于四字母的时区,比如 AEDT 或 CEST 就不太管用了。如果你需要同时处理这两种情况,可以参考这个链接下的答案:Parsing date/time string with timezone abbreviated name in Python?,这个方法可以处理大多数常用的时区。

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 对应的是 -0400 的 UTC 时区偏移,但在澳大利亚可能不对,因为那里 EDT 是 +1100(在这种情况下,pytz 使用的是 AEDT),也就是说,时区缩写可能会有歧义。你可以查看 用时区缩写解析日期/时间字符串在 Python 中的实现?

相关的 Python 错误:%Z 在 strptime 中与 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)

撰写回答