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:
- 使用datetime.now(pytz.utc)获取当前日期时间
- 不要使用 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. 看看它是否解决了您的问题。如果没有,我很乐意再看一遍!
我正在 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:
- 使用datetime.now(pytz.utc)获取当前日期时间
- 不要使用 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. 看看它是否解决了您的问题。如果没有,我很乐意再看一遍!