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

Tro*_*vin 39 python datetime parsing http

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

换句话说,我想将像"Wed,2009年9月23日22:15:29 GMT"这样的字符串转换为python时间结构.

tzo*_*zot 47

>>> import email.utils as eut
>>> eut.parsedate('Wed, 23 Sep 2009 22:15:29 GMT')
(2009, 9, 23, 22, 15, 29, 0, 1, -1)
Run Code Online (Sandbox Code Playgroud)

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

def my_parsedate(text):
    return datetime.datetime(*eut.parsedate(text)[:6])
Run Code Online (Sandbox Code Playgroud)

  • 是的,解析可能是最好的妥协,尽管它的"容忍RFC 2822解析"与RFC 2616'2要求"MUST"不是100%兼容 - 例如,史诗般的失败在RFC 850格式上有两位数年份,例如`Sunday ,格林威治标准时间06-Nov-94 08:49:37,但2616表示客户必须能够解析RFC 850日期(叹息). (5认同)
  • 另请注意,email.util.parsedate()返回一个可以直接传递给time.mktime()的元组(这会给你一个从计算机上的纪元开始的秒数(本地时间,而不是UTC)). (3认同)
  • 在最新版本的python中,您可以使用`email.utils.parsedate_to_datetime` (3认同)
  • @driax:因为Epoch不依赖于本地时区的秒数,例如,`0`表示`1970-01-01T00:00:00Z` - 它是世界各地的同一时间实例(本地时钟显示不同的值,但是时间戳完全相同).除非输入时间字符串是UTC(GMT); 你应该[使用`mktime_tz(parsedate_tz())`代替](http://stackoverflow.com/a/26435566/4279) - 否则有关时区的信息会丢失. (2认同)

saa*_*aaj 10

因为Python 3.3有email.utils.parsedate_to_datetime其可以解析RFC 5322时间戳(又名IMF-fixdate,Internet邮件格式的固定长度格式中,一个子集HTTP-dateRFC 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)
Run Code Online (Sandbox Code Playgroud)

还有未记录的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)
Run Code Online (Sandbox Code Playgroud)

它是在 Python 2.4 中引入的,cookielib.http2time用于处理以Expires相同格式表示的Cookie指令。


Sil*_*ost 8

>>> 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)
Run Code Online (Sandbox Code Playgroud)