gpt4 book ai didi

python - 使用 python 解析电子邮件日期时间

转载 作者:太空狗 更新时间:2023-10-29 22:01:15 47 4
gpt4 key购买 nike

我正在尝试使用 python 脚本解析电子邮件的日期时间。

当我打开邮件详情时,邮件中的日期值如下所示...

from:    abcd@xyz.com
to: def@xyz.com
date: Tue, Aug 28, 2012 at 1:19 PM
subject: Subject of that mail

我正在使用类似的代码

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 解析的相同邮件日期时间的输出如下所示,带有时间偏移。

Tue, 28 Aug 2012 02:49:13 -0500

我真正希望的地方

Tue, Aug 28, 2012 at 1:19 PM

我很困惑这两个值之间的关系。谁能帮我弄清楚我需要同时获取邮件详细信息。

最佳答案

在 GMail 中查看电子邮件时,会在显示电子邮件发送日期和时间时使用您本地的时区。 “星期二,2012 年 8 月 28 日 02:49:13 -0500”被解析,然后更新到您本地的时区,并以特定于 GMail 的方式格式化。

stdlib方式的解析和格式化

email.utils 模块包含一个 parsedate_tz() function专门处理带有时区偏移量的电子邮件 header 。

它返回一个与 time.struct_time 兼容的元组,但添加了时区偏移量。额外的 mktime_tz() function将该元组转换为偏移值(自 UNIX 纪元以来的秒数)。然后可以轻松地将此值转换为 datetime.datetime() 类型的对象。

同一个模块还有一个formatdate() function将 UNIX 纪元时间戳转换为电子邮件兼容的日期字符串:

>>> 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

现在我们有一个适用于外发电子邮件的 UTC 格式化日期。要将此打印为我的本地时区(由我的计算机确定),您需要将 localtime 标志设置为 True:

>>> print formatdate(timestamp, True)
Tue, 28 Aug 2012 08:49:13 +0100

使用更好的工具进行解析和格式化

请注意,当我们尝试处理时区时,事情变得很麻烦,而且 formatdate() 函数不会为您提供任何格式不同的选项(就像 GMail 那样),也不它是否允许您选择不同的时区进行工作。

输入外部python-dateutil module ;它有一个可以处理任何事情的解析函数,并且正确地支持时区

>>> import dateutil.parser
>>> dt = dateutil.parser.parse(date)
>>> dt
datetime.datetime(2012, 8, 28, 2, 49, 13, tzinfo=tzoffset(None, -18000))

parse() 函数返回 datetime.datetime() instance ,这使格式化变得容易得多。现在我们可以使用 .strftime() function像您的电子邮件客户端那样输出:

>>> print dt.strftime('%a, %b %d, %Y at %I:%M %p')
Tue, Aug 28, 2012 at 02:49 AM

当然,那仍然是在本地时区;要将其转换为您的时区,请使用 .astimezone() method , 使用新的 tzone 对象。 python-dateutil 包为我们提供了一些便利。

以下是如何在本地时区(到您的机器)打印它:

>>> 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

或改用特定时区:

>>> 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

关于python - 使用 python 解析电子邮件日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160010/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com