Python pyExchange的时区问题
我正在windows 7计算机上使用。我有一个简单的python v2.7脚本,用于从exchange服务器检索Outlook日历事件。脚本如下所示: 代码: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 =
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:
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