从电子邮件分析日期与时区? [英] Parsing date with timezone from an email?
问题描述
我正在尝试从电子邮件中检索日期。起初很容易:
message = email.parser.Parser()。parse(file)
date = message ['Date']
打印日期
我收到:
'星期一,2009年11月16日13:32:02 +0100'
但是我需要一个很好的datetime对象,所以我使用:
datetime.strptime ('星期一,2009年11月16日13:32:02 +0100','%a,%d%b%Y%H:%M:%S%Z')
/ pre>
其中引发
ValueError,因为%Z不是+0100
的格式。但是,在文档中找不到时区的正确格式,区域只有这个%Z
。有人可以帮助我吗?解决方案
email.utils
parsedate()
功能为RFC 2822格式,据我所知,这不是不推荐使用。>>>> import email.utils
>>>进口时间
>>>> import datetime
>>>> mail.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
总是期望本地时间元组 here 。>>> (time.mktime(email.utils.parsedate('Mon,16 Nov 2009 13:32:02 +0900'))==
... time.mktime(email.utils.parsedate('Mon,16 2009年11月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
I am trying to retrieve date from an email. At first it's easy:
message = email.parser.Parser().parse(file) date = message['Date'] print date
and I receive:
'Mon, 16 Nov 2009 13:32:02 +0100'
But I need a nice datetime object, so I use:
datetime.strptime('Mon, 16 Nov 2009 13:32:02 +0100', '%a, %d %b %Y %H:%M:%S %Z')
which raises
ValueError, since %Z isn't format for +0100
. But I can't find proper format for timezone in the documentation, there is only this%Z
for zone. Can someone help me on that?解决方案
email.utils
has aparsedate()
function for the RFC 2822 format, which as far as I know is not deprecated.>>> 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)
Please note, however, that the
parsedate
method does not take into account the time zone andtime.mktime
always expects a local time tuple as mentioned here.>>> (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
So you'll still need to parse out the time zone and take into account the local time difference, too:
>>> 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
这篇关于从电子邮件分析日期与时区?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!