gpt4 book ai didi

python - pyExchange 的时区问题

转载 作者:行者123 更新时间:2023-11-28 18:39:38 26 4
gpt4 key购买 nike

我正在使用 pyExchange在 Windows 7 机器上。我有一个简单的 python v2.7 脚本,用于从交换服务器检索 Outlook 日历事件。脚本如下:

代码:

from pyexchange import Exchange2010Service, ExchangeNTLMAuthConnection
from datetime import datetime
import time
from pytz import timezone

def getEvents():
URL = u'https://xxxxx.de/EWS/Exchange.asmx'
USERNAME = u'MS.LOCAL\\xxxxx'
PASSWORD = u"xxxxxx"

connection = ExchangeNTLMAuthConnection(url=URL,
username=USERNAME,
password=PASSWORD)

service = Exchange2010Service(connection)

timestamp = datetime.now()
print timestamp.strftime('%Y, %m, %d, %H, %M, %S')

print time.timezone

eventsList = service.calendar().list_events(
start=timezone("Europe/Amsterdam").localize(datetime(2015, 1, 19, 0, 0, 0)),
end=timezone("Europe/Amsterdam").localize(datetime(2015, 1, 19, 23, 59, 59)),
details=True
)

for event in eventsList.events:
print "{start} {stop} - {subject} - {room}".format(
start=event.start,
stop=event.end,
subject=event.subject,
room=event.location
)

getEvents()

问题:

事件的时间戳与 Outlook 中事件的时间戳不匹配。我使用 Outlook 以及使用 pyExchange 手动创建了事件脚本。

例如:如果我在 Outlook 中创建一个从 11:00 AM - 11:30 AM 的事件,那么上面的脚本将返回该事件的时间戳作为 10:00 AM - 上午 10:30。时间少了一小时/回来。

如果我检查我的 time.timezone,它会返回 W。欧洲标准时间。我也在脚本中指定了我的时区。 欧洲/阿姆斯特丹。但问题仍然存在。我还检查了 Outlook 中的时区设置。如下所示: enter image description here

我登录到 Exchange 服务器,它也与我的客户端计算机处于同一时区。

关于为什么事件的时间不正确有什么建议吗?这是 pyExchange 中的错误吗?如果有人可以对此进行测试并在此处报告,我将不胜感激,以确保不仅仅是我面临这个问题。

最佳答案

我看了看,这可能不是 pyexchange 中的错误,而是您处理时区的方式。不客气,遗憾的是,它们在 Python 中极其困惑。

首先,该包以 UTC 而非您的本地时间返回事件日期。由于您的时区为 +1 UTC,因此您看到的时间比预期时间晚了一个小时。这是我使用您的脚本从我的日历中提取的事件(这是开始/结束/名称/房间):

2015-01-19 20:00:00+00:00 2015-01-19 21:00:00+00:00 - Lunch - Cafe

请注意 +00:00 - 这意味着它采用 UTC。加利福尼亚州的中午是 20:00 UTC。

总是,总是,在处理日期时间时使用 UTC。这是 pytz 人在 why localtimes are dangerous. 上的一些文档

PyExchange 试图支持您并将本地时间转换为 UTC,但它始终返回 UTC。这是故意的,因为请参阅前面的链接。

现在,回答您关于如何让它发挥作用的问题。首先,使用这些方便的提示将您的本地时间转换为 UTC:

  1. 使用 datetime.now(pytz.utc) 获取当前日期时间
  2. 不要使用 datetime(…, tzinfo=timezone) 创建时区感知日期时间对象,它是 broken .相反,创建 datetime 对象并对其调用 timezone.localize。

对你来说,这意味着你必须做一些丑陋的事情,比如:

start = timezone("Europe/Amsterdam").localize(datetime(2015, 1, 19, 0, 0, 0))
start = start.astimezone(pytz.utc)

然后,当您想将 UTC 日期显示为您自己的时间时,请执行以下操作:

event.start.astimezone(timezone("Europe/Amsterdam"))

当我这样做时,我从你的脚本中看到了这个输出:

2015-01-19 21:00:00+01:00 2015-01-19 22:00:00+01:00 - Lunch - Cafe

这是我所期望的。中午我的时间是晚上 9 点你的时间。

Here's a gist of your script that I changed.看看它是否解决了您的问题。如果没有,我很乐意再看一遍!

关于python - pyExchange 的时区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28024646/

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