如何将 RFC 2822 日期/时间解析为 Python 日期时间?
我有一个 RFC 2822 指定形式的日期 - 比如说 Fri, 15 May 2009 17:58:28 +0000
,作为字符串。 在 Python 2.5 中是否有一种快速和/或标准的方法将其作为 datetime
对象获取? 我尝试生成 strptime 格式字符串,但 +0000 时区说明符使解析器感到困惑。
I have a date of the form specified by RFC 2822 -- say Fri, 15 May 2009 17:58:28 +0000
, as a string. Is there a quick and/or standard way to get it as a datetime
object in Python 2.5? I tried to produce a strptime format string, but the +0000 timezone specifier confuses the parser.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
问题是 parsedate 将忽略偏移量。
改为这样做:
The problem is that parsedate will ignore the offset.
Do this instead:
我想详细说明一下之前的答案。
email.utils.parsedate
和email.utils.parsedate_tz
都返回元组,因为OP需要一个datetime.datetime
对象,我添加这些示例是为了完整性:或者:
请注意,
d1
和d2
都是简单的日期时间对象,没有存储时区信息。 如果您需要了解日期时间对象,请检查tzinfo
datetime()
参数。或者,您可以使用 dateutil 模块
I'd like to elaborate on previous answers.
email.utils.parsedate
andemail.utils.parsedate_tz
both return tuples, since the OP needs adatetime.datetime
object, I'm adding these examples for completeness:Or:
Note that
d1
andd2
are both naive datetime objects, there's no timezone information stored. If you need aware datetime objects, check thetzinfo
datetime()
arg.Alternatively you could use the dateutil module
文档。
Documentation.
看起来 Python 3.3 以后在 email.utils 中有一个新方法
parsedate_to_datetime
来处理中间步骤:http://python.readthedocs.org/en /latest/library/email.util.html#email.utils.parsedate_to_datetime
It looks like Python 3.3 going forward has a new method
parsedate_to_datetime
in email.utils that takes care of the intermediate steps:http://python.readthedocs.org/en/latest/library/email.util.html#email.utils.parsedate_to_datetime
email.util 中有一个解析函数。
它解析所有有效的 RFC 2822 日期和一些特殊情况。
There is a parsedate function in email.util.
It parses all valid RFC 2822 dates and some special cases.
email.utils.parsedate_tz(日期)< /code>
是要使用的函数。 以下是一些变化。
电子邮件日期/时间字符串 (RFC 5322,RFC 2822,RFC 1123) 到 unix 时间戳(以浮点秒为单位):
确保您不使用
mktime
(解释计算机本地时间中的 time_struct,不是世界标准时间); 使用timegm
或mktime_tz
代替 (但请注意下一段中的mktime_tz
警告)。如果您确定您拥有 python 版本 2.7.4、3.2.4、3.3 或更高版本,那么您可以使用
email.utils.mktime_tz(tt)
而不是calendar.timegm(tt) - tt[9]< /代码>。 在此之前,
mktime_tz
在本地时区秋季夏令时转换期间调用时给出的时间不正确 (错误 14653)。感谢 @jf-sebastian 提供有关 mktime 和 mktime_tz 的注意事项 。
电子邮件日期/时间字符串 (RFC 5322,RFC 2822,RFC 1123) 在 python 3.3 上“感知”
datetime
:在 python 3.3 及更高版本上,使用
email.utils.parsedate_to_datetime
,它返回一个具有原始区域偏移量的感知datetime
:警告:如果时间落在闰秒,这将抛出
ValueError
,例如email.utils.parsedate_to_datetime( “2016 年 12 月 31 日星期六 15:59:60 -0800”)
。电子邮件日期/时间字符串 (RFC 5322,RFC 2822,RFC 1123) 到 UTC 区域中的“aware”
datetime
:这只是转换为时间戳,然后转换为 UTC
datetime
:电子邮件日期/时间字符串 (RFC 5322、RFC 2822、RFC 1123) 到 python “aware”
datetime
并带有原始偏移量:早于 python 3.2,python 没有附带 tzinfo 实现,所以这里有一个使用
dateutil.tz.tzoffset
(pip install dateutil
):如果您使用的是 python 3.2,则可以使用内置的
tzinfo
实现datetime.timezone
:tz = datetime.timezone(datetime.timedelta(seconds=tt[9]))
而不是第三方dateutil.tz.tzoffset
。再次感谢@jf-sebastian 有关固定闰秒的说明。
email.utils.parsedate_tz(date)
is the function to use. Following are some variations.Email date/time string (RFC 5322, RFC 2822, RFC 1123) to unix timestamp in float seconds:
Make sure you do not use
mktime
(which interprets the time_struct in your computer’s local time, not UTC); usetimegm
ormktime_tz
instead (but beware caveat formktime_tz
in the next paragraph).If you are sure that you have python version 2.7.4, 3.2.4, 3.3, or newer, then you can use
email.utils.mktime_tz(tt)
instead ofcalendar.timegm(tt) - tt[9]
. Before that,mktime_tz
gave incorrect times when invoked during the local time zone’s fall daylight savings transition (bug 14653).Thanks to @j-f-sebastian for caveats about mktime and mktime_tz.
Email date/time string (RFC 5322, RFC 2822, RFC 1123) to “aware”
datetime
on python 3.3:On python 3.3 and above, use
email.utils.parsedate_to_datetime
, which returns an awaredatetime
with the original zone offset:Caveat: this will throw
ValueError
if the time falls on a leap second e.g.email.utils.parsedate_to_datetime("Sat, 31 Dec 2016 15:59:60 -0800")
.Email date/time string (RFC 5322, RFC 2822, RFC 1123) to “aware”
datetime
in UTC zone:This just converts to timestamp and then to UTC
datetime
:Email date/time string (RFC 5322, RFC 2822, RFC 1123) to python “aware”
datetime
with original offset:Prior to python 3.2, python did not come with tzinfo implementations, so here an example using
dateutil.tz.tzoffset
(pip install dateutil
):If you are using python 3.2, you can use the builtin
tzinfo
implementationdatetime.timezone
:tz = datetime.timezone(datetime.timedelta(seconds=tt[9]))
instead of the third-partydateutil.tz.tzoffset
.Thanks to @j-f-sebastian again for note on clamping the leap second.