从电子邮件中解析带时区的日期?

新手上路,请多包涵

我正在尝试从电子邮件中检索日期。一开始很简单:

 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 用于时区。有人可以帮我吗?

原文由 gruszczy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 909
2 个回答

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

原文由 Ben James 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 email.utils.parsedate_tz(date)

 msg=email.message_from_file(open(file_name))
date=None
date_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

原文由 guettli 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题