我有一个由RFC 2822指定格式的日期 - 比如Fri, 15 May 2009 17:58:28 +0000
,作为一个字符串。是否有一种快速和/或标准的方式将它作为Python 2.5中的datetime
对象?我试图产生一个strptime格式的字符串,但+0000时区说明符混淆了解析器。如何将RFC 2822日期/时间解析为Python日期时间?
回答
问题是parsedate会忽略偏移量。
而是执行此操作:
from email.utils import parsedate_tz
print parsedate_tz('Fri, 15 May 2009 17:58:28 +0700')
email.util中有一个解析函数。 它解析所有有效的RFC 2822日期和一些特殊情况。
from email.utils import parsedate
print parsedate('Fri, 15 May 2009 17:58:28 +0000')
我想阐述一下以前的答案。 email.utils.parsedate
和email.utils.parsedate_tz
都返回元组,因为OP需要datetime.datetime
对象,我添加这些例子的完整性:
from email.utils import parsedate
from datetime import datetime
import time
t = parsedate('Sun, 14 Jul 2013 20:14:30 -0000')
d1 = datetime.fromtimestamp(time.mktime(t))
或者:
d2 = datetime.datetime(*t[:6])
注意d1
和d2
都是天真datetime对象,没有存储时区信息。如果您需要了解日期时间对象,请检查tzinfo
datetime()
arg。
另外,您可以使用dateutil模块
它看起来像Python 3.3前进在email.utils的新方法parsedate_to_datetime
这需要中间步骤的护理:
email.utils。 parsedate_to_datetime(日期)
format_datetime的倒数()。执行与parsedate()相同的功能,但在 成功返回日期时间。如果输入日期的时区为-0000, ,则日期时间将是天真的日期时间,并且如果日期符合 与RFC的关系,则它将表示UTC的时间,但不指示 消息的实际源时区日期来自。如果 输入日期有任何其他有效的时区偏移量,日期时间将是 一个知道的日期时间与相应的时区tzinfo。
版本3.3中的新功能。
http://python.readthedocs.org/en/latest/library/email.util.html#email.utils.parsedate_to_datetime
email.utils.parsedate_tz(date)
是使用功能。以下是一些变化。
电子邮件日期/时间字符串(RFC 5322,RFC 2822,RFC 1123)为Unix时间戳浮法秒:
import email.utils
import calendar
def email_time_to_timestamp(s):
tt = email.utils.parsedate_tz(s)
if tt is None: return None
return calendar.timegm(tt) - tt[9]
import time
print(time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(email_time_to_timestamp("Wed, 04 Jan 2017 09:55:45 -0800"))))
# 2017-01-04T17:55:45Z
确保您不使用mktime
(它解释time_struct在您的计算机的本地时间,不是UTC);改为使用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
在本地时区的秋季夏令时转换(bug 14653)期间调用时会给出错误的时间。
感谢@ j-f-sebastian为caveats about mktime and mktime_tz。
电子邮件日期/时间字符串(RFC 5322,RFC 2822,RFC 1123)到“知道” datetime
有关python 3.3:
关于Python 3.3以上,使用email.utils.parsedate_to_datetime
,其与原始区域返回意识到datetime
偏移:
import email.utils
email.utils.parsedate_to_datetime(s)
print(email.utils.parsedate_to_datetime("Wed, 04 Jan 2017 09:55:45 -0800").isoformat())
# 2017-01-04T09:55:45-08:00
警告:如果时间落在闰秒上,这将抛出ValueError
例如email.utils.parsedate_to_datetime("Sat, 31 Dec 2016 15:59:60 -0800")
。
电子邮件日期/时间字符串(RFC 5322,RFC 2822,RFC 1123),以“知道” datetime
在UTC区:
这只是转换成时间戳,然后以UTC datetime
:
import email.utils
import calendar
import datetime
def email_time_to_utc_datetime(s):
tt = email.utils.parsedate_tz(s)
if tt is None: return None
timestamp = calendar.timegm(tt) - tt[9]
return datetime.datetime.utcfromtimestamp(timestamp)
print(email_time_to_utc_datetime("Wed, 04 Jan 2017 09:55:45 -0800").isoformat())
# 2017-01-04T17:55:45
电子邮件日期/时间字符串(RFC 5322,RFC 2822,RFC 1123)到python“知道”datetime
与原始偏移量:
之前到Python 3.2,Python中没有附带tzinfo实现,所以这里使用dateutil.tz.tzoffset
(pip install dateutil
)的例子:
import email.utils
import datetime
import dateutil.tz
def email_time_to_datetime(s):
tt = email.utils.parsedate_tz(s)
if tt is None: return None
tz = dateutil.tz.tzoffset("UTC%+02d%02d"%(tt[9]//60//60, tt[9]//60%60), tt[9])
return datetime.datetime(*tt[:5]+(min(tt[5], 59),), tzinfo=tz)
print(email_time_to_datetime("Wed, 04 Jan 2017 09:55:45 -0800").isoformat())
# 2017-01-04T09:55:45-08:00
如果您正在使用python 3.2,你可以使用内置的tzinfo
实施datetime.timezone
:tz = datetime.timezone(datetime.timedelta(seconds=tt[9]))
,而不是第三方dateutil.tz.tzoffset
。
再次感谢@ j-f-sebastian for note on clamping the leap second。
- 1. 将Python日期时间转换为rfc 2822
- 2. 解析JAVA中的RFC 2822日期
- 3. 将MySQL日期时间转换为RFC 2822使用PHP日期()函数
- 4. 日期时间Python解析
- 5. 解析日期时间
- 6. 解析日期和时间
- 7. 解析日期时间
- 8. 解析日期时间
- 9. 解析器日期时间
- 10. 解析日期时间HHMMSS
- 11. Python将秒转换为日期时间日期和时间
- 12. 解析C#日期时间到javascript日期时间
- 13. 解析ISO日期时间在Python
- 14. 如何将IronPython日期时间转换为.NET日期时间?
- 15. 如何使用pa ++解析日期时间并将其转换为RFC 3339?
- 16. 如何解析日期时间sec.ms
- 17. 如何仅解析日期到时间?
- 18. Python日期时间为int
- 19. 如何使用Chronic在日期时间text_field中解析日期
- 20. 与日期时间时区converttime解析
- 21. Grails无法将日期/时间从JSON解析回约达日期时间
- 22. 如何将整数时间戳转换为Python日期时间
- 23. C#日期时间 - RFC 3339格式
- 24. 将日期,日期时间转换为时间戳
- 25. 将日期和时间转换为GMT + 10日期和时间
- 26. 将日期时间转换为另一日期时间
- 27. 将XML日期时间转换为SQL日期时间
- 28. 乔达:将日期和时间转换为日期时间
- 29. 将日期时间字符串转换为日期时间
- 30. 将日期和时间转换为日期+时间戳
+1我不知道这个功能,真的很整齐。 – 2009-05-19 21:14:48