pyExchange 的时区问题

Timezone issue with pyExchange

我正在 windows 7 机器上使用 pyExchange。我有一个简单的 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 创建一个事件,那么上面的脚本将 return 该事件的时间戳作为 10:00 AM - 10:30 AM。时间是一小时less/back。

如果我检查我的 time.timezone 它 returns W. Europe Standard Time。我也在脚本中指定了我的时区。 Europe/Amsterdam。但问题仍然存在。我还检查了 Outlook 中的时区设置。如下所示:

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

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

我看了看,这可能不是 pyexchange 中的错误,而是您处理时区的方式。不丢人,可悲的是,他们在 Python.

中非常混乱

首先,程序包以 UTC 而非您的本地时间返回事件日期。由于您的时区为 +1 UTC,因此您看到的时间比预期时间晚了一个小时。这是我使用您的脚本从我的日历中提取的事件(这是 start/end/name/room):

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 folk on why localtimes are dangerous.

的一些文档

PyExchange 会尽力支持您并将本地时间转换为 UTC,但它总是 returns UTC。这是故意的,因为看到前面的 link.

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

  1. 使用datetime.now(pytz.utc)获取当前日期时间
  2. 不要使用 datetime(…, tzinfo=timezone) 创建时区感知日期时间对象,它是 broken。相反,创建日期时间对象并对其调用 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. 看看它是否解决了您的问题。如果没有,我很乐意再看一遍!