为了账号安全,请及时绑定邮箱和手机立即绑定

通过电子邮件解析带有时区的日期?

通过电子邮件解析带有时区的日期?

胡子哥哥 2019-08-13 16:40:42
通过电子邮件解析带有时区的日期?我正在尝试从电子邮件中检索日期。起初它很容易:message = email.parser.Parser().parse(file)date = message['Date']print date我收到:'Mon, 16 Nov 2009 13:32:02 +0100'但我需要一个不错的日期时间对象,所以我使用:datetime.strptime('Mon, 16 Nov 2009 13:32:02 +0100', '%a, %d %b %Y %H:%M:%S %Z')提升了ValueError, since %Z isn't format for +0100。但我在文档中找不到适当的时区格式,只有这个%Z区域。有人可以帮助我吗?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

email.utils具有parsedate()RFC 2822格式的功能,据我所知,该功能并未弃用。

>>> import email.utils>>> import time>>> import datetime>>> email.utils.parsedate('Mon, 16 Nov 2009 13:32:02 +0100')(2009, 11, 16, 13, 32, 2, 0, 1, -1)>>> time.mktime((2009, 11, 16, 13, 32, 2, 0, 1, -1))1258378322.0>>> datetime.datetime.fromtimestamp(1258378322.0)datetime.datetime(2009, 11, 16, 13, 32, 2)

但是请注意,该parsedate方法没有考虑时区,并且time.mktime总是期望这里提到的本地时间元组。

>>> (time.mktime(email.utils.parsedate('Mon, 16 Nov 2009 13:32:02 +0900')) ==... time.mktime(email.utils.parsedate('Mon, 16 Nov 2009 13:32:02 +0100'))True

因此,您仍然需要解析时区并考虑当地时差:

>>> REMOTE_TIME_ZONE_OFFSET = +9 * 60 * 60>>> (time.mktime(email.utils.parsedate('Mon, 16 Nov 2009 13:32:02 +0900')) +... time.timezone - REMOTE_TIME_ZONE_OFFSET)1258410122.0


查看完整回答
反对 回复 2019-08-13
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

用途email.utils.parsedate_tz(date)

msg=email.message_from_file(open(file_name))date=Nonedate_str=msg.get('date')if date_str:
    date_tuple=email.utils.parsedate_tz(date_str)
    if date_tuple:
        date=datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple))if date:
    ... # valid date found


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 934 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信