PyExchange的时区问题

2024-04-29 10:15:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在windows 7计算机上使用pyExchange。我有一个简单的pythonv2.7脚本,用于从exchange服务器检索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 AM的形式返回该事件的时间戳。时间少了一个小时。在

如果我检查我的时区它返回W. Europe Standard Time。我也在脚本中指定了我的时区,即Europe/Amsterdam。但问题依然存在。我还检查了Outlook的时区设置。如下图所示: enter image description here

我登录到Exchange服务器,它也与我的客户机位于同一时区。在

有什么建议可以解释为什么时间不合适?这是pyExchange中的bug吗?我真的很感激,如果有人能测试这一点,并在这里报告,只是为了确定不是只有我才面临这个问题。在


Tags: fromimport脚本eventdatetime时间事件am
1条回答
网友
1楼 · 发布于 2024-04-29 10:15:19

我看了一下,这可能不是pyexchange中的bug,而是您如何处理时区。毫无遗憾,它们在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。这里有一些来自pytz民间的文档why localtimes are dangerous.

PyExchange试图支持您,并将localtime转换为UTC,但它始终返回UTC。这是故意的,因为看到前面的链接。在

现在,来回答你的问题,让它发挥作用。首先,使用以下提示将本地时间转换为UTC:

  1. 使用日期时间。现在(太平洋标准时间)获取当前日期时间
  2. 不要使用datetime(…,tzinfo=timezone)来创建支持时区的datetime对象,它是broken。相反,创建datetime对象并调用时区。本地化在上面。在

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

^{pr2}$

然后,如果要将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.看看它是否解决了您的问题。如果没有,我很高兴再看一次!在

相关问题 更多 >