使用python连接时Outlook电子邮件中的时区问题

时间:2017-09-19 09:21:39

标签: python datetime outlook win32com

当我使用msg.SentOn.stftime("%Y-%m-%d %H:%M:%S %Z %z %p")时,我将GMT作为时区,但所有消息时间都在IST中,例如在1.30PM IST发送的电子邮件显示2017-09-19 13:30:51 GMT+00:00 +000。但我想要的是2017-09-19 09:00:51 GMT+00:00 +000。代码如下

import datetime, win32com.client as win32

outlook = win32.Dispatch("Outlook.Application").GetNamespace("MAPI")
excel = win32.gencache.EnsureDispatch("Excel.Application")

inbox = outlook.GetDefaultFolder(6) 

for msg in inbox.Items:
    print(msg.SentOn.strftime("%Y-%m-%d %H:%M:%S %Z %z %p"), msg.Subject)

2 个答案:

答案 0 :(得分:1)

我使用此代码固定了message.SentOn的时区。

from datetime import datetime
import pytz

def fix_timezone(dt):
    local_tz = dt.astimezone().tzinfo # is there a cleaner way to get the local tz?
    shifted = dt.replace(tzinfo=local_tz)
    return shifted.astimezone(pytz.utc)

wrong_time = datetime(2019, 6, 1, 17, 0, 16, tzinfo=pytz.utc)
correct_time_utc = fix_timezone(wrong_time)
print(correct_time_utc)

我试图找到一种更干净的方法来获取本地计算机的时区,但对发现的内容不满意。我只是从astimezone()

的返回值中窃取了它

答案 1 :(得分:0)

这实际上比我想象的容易得多。

Python有一个名为pytz的库,可以与datetime结合使用,以便轻松进行时区转换。

这可以通过使用.astimezone(pytz.timezone([TIMEZONE]))来完成,将[TIMEZONE]替换为此列表中您需要的任何时区: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List

请参阅下面的示例,该示例将邮件发送时间的时区设置为America/Los_Angeles

import datetime, pytz, win32com.client as win32

outlook = win32.Dispatch("Outlook.Application").GetNamespace("MAPI")
excel = win32.gencache.EnsureDispatch("Excel.Application")

inbox = outlook.GetDefaultFolder(6) 

for msg in inbox.Items:
    print(msg.SentOn.astimezone(pytz.timezone('America/Los_Angeles')).strftime("%Y-%m-%d %H:%M:%S %Z %z %p"), msg.Subject)