Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyExchange的时区问题_Python_Python 2.7_Outlook_Timezone_Pyexchange - Fatal编程技术网

Python pyExchange的时区问题

Python pyExchange的时区问题,python,python-2.7,outlook,timezone,pyexchange,Python,Python 2.7,Outlook,Timezone,Pyexchange,我正在windows 7计算机上使用。我有一个简单的python v2.7脚本,用于从exchange服务器检索Outlook日历事件。脚本如下所示: 代码: from pyexchange import Exchange2010Service, ExchangeNTLMAuthConnection from datetime import datetime import time from pytz import timezone def getEvents(): URL =

我正在windows 7计算机上使用。我有一个简单的python v2.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和脚本手动创建了事件

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

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

我已登录到Exchange服务器,并且它与我的客户端计算机位于同一时区


关于为什么时间不适合这些活动,有什么建议吗?这是pyExchange中的错误吗?如果有人能测试这个问题并在这里报告,我将不胜感激,只是为了确保不仅是我面临这个问题。

我看了一下,这可能不是pyexchange中的错误,而是您如何处理时区。遗憾的是,它们在Python中非常混乱

首先,程序包以UTC而不是本地时间返回事件日期。您的时区为+1 UTC,因此比预期时间缩短了一小时。以下是我使用您的脚本从日历中提取的事件(这是开始/结束/姓名/房间):

注意+00:00-这意味着它以UTC为单位。加利福尼亚的中午是UTC的20:00

在处理日期时间时始终使用UTC。这是pytz公司的一些文档

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

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

  • 使用datetime.now(pytz.utc)获取当前日期时间
  • 不要使用datetime(…,tzinfo=timezone)来创建时区感知的datetime对象,这是错误的。相反,创建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点你的时间


    看看它是否能解决您的问题。如果没有,我很高兴再看一次

    它看起来像是API使用问题(传递了错误的参数,例如,它可能期望本地时区中存在未经处理的datetime对象)或Exchange堆栈中存在错误。
    tzlocal.get_localzone()
    返回什么?它返回
    Europe/Berlin
    即使我在脚本中更改了它而不是
    Europe/Amsterdam
    ,也不会更改。这个问题仍然存在。欧洲/柏林和欧洲/阿姆斯特丹现在都是CET+0100。最近日期的时区相同。我不会期望有不同的结果(这只是一个健全的检查)。时区是棘手的动物,它很可能是软件包中的一个bug。对不起,出了问题!pytz谈到表示本地时间的朴素datetime对象。包应接受任何时区中的aware datetime对象,例如,
    datetime.now(时区('Europe/Amsterdam'))
    ——表示
    Europe/Amsterdam
    时区中当前时间的aware datetime对象。(如果需要,您始终可以在内部将其转换为UTC(忽略极端的日期时间值)。在调用
    .localize()时,更愿意指定
    is_dst=None
    以引发不明确或不存在的本地时间的异常(除非显式静音,否则不应忽略错误)下面是如何根据代码< >代码>结束/代码>,<代码>开始/代码> A..j.F.SEBASTAN-YUP。Pyexchange在任何时区都接受任何已知的DATETION对象,它不返回本地时区中的日期时间。或者它应该。如果它不这样做,我认为是Bug。):我最近读到了大约1。不要修改输入(保留它,不管它是什么)2。根据比较标准化。它可以转换为时区:1。返回与接收到的datetime对象完全相同的datetime对象2。规范化(转换为utc进行比较、日期算术等)。这可能适用于编码,但不适用于时区。从UTC,您可以转换为任何格式,但反之则不正确,假设您可以转换是危险的。最佳做法是始终使用UTC,并且仅使用localtime进行显示。通读以下内容:
    2015-01-19 21:00:00+01:00 2015-01-19 22:00:00+01:00 - Lunch - Cafe