如何在Python中解析HTTP日期字符串?

53 投票
4 回答
21513 浏览
提问于 2025-04-15 14:34

有没有简单的方法可以在Python中解析HTTP日期字符串?根据标准,HTTP日期字符串有几种格式;这个方法应该能够处理这些格式。

换句话说,我想把像“Wed, 23 Sep 2009 22:15:29 GMT”这样的字符串转换成Python的时间结构。

4 个回答

9

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。很多时候,其他人也会遇到类似的问题,所以我们可以在一些技术论坛,比如StackOverflow,找到解决方案。

在这些论坛上,用户会提问,描述他们遇到的具体问题,并且其他用户会提供他们的解决办法或者建议。这种互动不仅能帮助提问者解决问题,也能让其他人从中学习到新的知识。

总之,编程的学习过程就是一个不断解决问题的过程,而这些技术论坛就像是一个大家互相帮助的社区。

>>> import datetime
>>> datetime.datetime.strptime('Wed, 23 Sep 2009 22:15:29 GMT', '%a, %d %b %Y %H:%M:%S GMT')
datetime.datetime(2009, 9, 23, 22, 15, 29)
17

从Python 3.3开始,新增了一个叫做 email.utils.parsedate_to_datetime 的功能,它可以解析 RFC 5322 时间戳(也叫 IMF-fixdate,这是一种互联网消息格式的固定长度格式,属于 HTTP-date 的一部分,详细信息可以参考 RFC 7231)。

>>> from email.utils import parsedate_to_datetime
... 
... s = 'Sun, 06 Nov 1994 08:49:37 GMT'
... parsedate_to_datetime(s)
0: datetime.datetime(1994, 11, 6, 8, 49, 37, tzinfo=datetime.timezone.utc)

还有一个没有文档说明的功能 http.cookiejar.http2time,它也能实现类似的功能,具体如下:

>>> from datetime import datetime, timezone
... from http.cookiejar import http2time
... 
... s = 'Sun, 06 Nov 1994 08:49:37 GMT'
... datetime.utcfromtimestamp(http2time(s)).replace(tzinfo=timezone.utc)
1: datetime.datetime(1994, 11, 6, 8, 49, 37, tzinfo=datetime.timezone.utc)

这个功能最早是在Python 2.4中引入的,名字叫 cookielib.http2time,主要是用来处理Cookie中的 Expires 指令,这个指令也是用相同的格式表示的。

62
>>> import email.utils, datetime
>>> email.utils.parsedate('Wed, 23 Sep 2009 22:15:29 GMT')
(2009, 9, 23, 22, 15, 29, 0, 1, -1)

如果你想要一个 datetime.datetime 对象,可以这样做:

# Python <3.3
def my_parsedate(text):
    return datetime.datetime(*eut.parsedate(text)[:6])

# Python ≥3.3
def my_parsedate(text):
    return email.utils.parsedate_to_datetime(text)

email.utils.parsedate

这个函数试着按照 RFC 2822 的规则来解析日期。不过,有些邮件程序并不完全遵循这个格式,所以 parsedate() 会在这种情况下尽量猜测正确。输入的日期是一个字符串,格式像这样:"Mon, 20 Nov 1995 19:12:08 -0500"。 如果成功解析了日期,parsedate() 会返回一个包含9个元素的元组,你可以直接把它传给 time.mktime();如果解析失败,则会返回 None。需要注意的是,返回的元组中的第6、7和8个元素是不能用的。

email.utils.parsedate_to_datetime

这个函数是 format_datetime() 的反向操作。它的功能和 parsedate() 一样,但如果成功的话会返回一个 datetime 对象;如果日期包含无效值,比如小时数大于23,或者时区偏移不在-24到24小时之间,就会抛出 ValueError 错误。如果输入的日期时区是 -0000,那么返回的 datetime 就是一个“无时区”的 datetime;如果日期符合 RFC 规范,它会表示一个 UTC 时间,但不会显示消息来源的实际时区。如果输入日期有其他有效的时区偏移,返回的 datetime 就会是一个“有时区”的 datetime,并带有相应的时区信息。

撰写回答