Email datetime parsing with python
我试图使用python脚本解析电子邮件的日期时间。
在我打开邮件时,邮件日期值如下所示...
1 2 3 4 | from: abcd@xyz.com to: def@xyz.com date: Tue, Aug 28, 2012 at 1:19 PM subject: Subject of that mail |
我正在使用代码
1 2 3 4 5 6 7 | mail = email.message_from_string(str1) #to = re.sub('</br>','',mail["To"]) to = parseaddr(mail.get('To'))[1] sender = parseaddr(mail.get('From'))[1] cc_is = parseaddr(mail.get('Cc'))[1] date = mail["Date"] print date |
使用python解析的相同邮件日期时间的输出如下所示,具有时间偏移。
1 | Tue, 28 Aug 2012 02:49:13 -0500 |
我在哪里实际上是希望的
1 | Tue, Aug 28, 2012 at 1:19 PM |
我对这两个价值观的关系感到很困惑。
任何人都可以帮我弄明白我需要同时进入邮件详细信息。
查看GMail中的电子邮件时,会在显示发送电子邮件的日期和时间时使用您的本地时区。解析"Tue,2012年8月28日02:49:13 -0500",然后更新到您当地的时区,并以GMail特定的方式格式化。
解析和格式化stdlib方式
它返回与
同一模块还具有
1 2 3 4 5 6 7 | >>> from email.utils import parsedate_tz, mktime_tz, formatdate >>> import time >>> date = 'Tue, 28 Aug 2012 02:49:13 -0500' >>> tt = parsedate_tz(date) >>> timestamp = mktime_tz(tt) >>> print formatdate(timestamp) Tue, 28 Aug 2012 07:49:13 -0000 |
现在我们有一个适合外发电子邮件的格式化日期。要将其打印为我的本地时区(由我的计算机确定),您需要将
1 2 | >>> print formatdate(timestamp, True) Tue, 28 Aug 2012 08:49:13 +0100 |
使用更好的工具进行解析和格式化
请注意,当我们尝试处理时区时,事情变得毛茸茸,并且
输入外部
1 2 3 4 | >>> import dateutil.parser >>> dt = dateutil.parser.parse(date) >>> dt datetime.datetime(2012, 8, 28, 2, 49, 13, tzinfo=tzoffset(None, -18000)) |
1 2 | >>> print dt.strftime('%a, %b %d, %Y at %I:%M %p') Tue, Aug 28, 2012 at 02:49 AM |
当然,那仍然在当地时区;将其转换为您的时区,使用
以下是如何在本地时区(到您的机器)打印它:
1 2 3 | >>> import dateutil.tz >>> print dt.astimezone(dateutil.tz.tzlocal()).strftime('%a, %b %d, %Y at %I:%M %p') Tue, Aug 28, 2012 at 09:49 AM |
或者使用特定的时区代替:
1 2 | >>> print dt.astimezone(dateutil.tz.tzstr('Asia/Kolkata')).strftime('%a, %b %d, %Y at %I:%M %p') Tue, Aug 28, 2012 at 07:49 AM |
你只能使用stdlib来做到这一点:
1 2 3 4 | >>> from email.utils import parsedate_tz, mktime_tz, formatdate >>> ts = mktime_tz(parsedate_tz('Tue, 28 Aug 2012 02:49:13 -0500')) >>> formatdate(ts, localtime=True) # assuming Asia/Kolkata is the local timezone 'Tue, 28 Aug 2012 13:19:13 +0530' |
如果您想使用
1 2 3 | >>> from datetime import datetime >>> datetime.fromtimestamp(ts).strftime('%a, %b %d, %Y at %I:%M %p') 'Tue, Aug 28, 2012 at 01:19 PM' |
可以选择以下代码
1 2 3 4 | start = f.find('date:') + 5 # +5 is to exclude 'date'+':' i.e.(4+1=5) end = f.find('subject:', start) # parse from date to subject date_time = f[start:end] print date_time #it will print"Tue, Aug 28, 2012 at 1:19 PM" |