You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSGraph Python SDK中CalendarViewRequestBuilder日期参数失效排查

问题

使用MSGraph Python SDK的CalendarViewRequestBuilder时,按如下代码配置start_date_time和end_date_time参数:

# Create GraphServiceClient
graph_client = GraphServiceClient(credential, scopes)

# Define date range for fetching events
start_date = datetime.now(pytz.utc)
end_date = start_date + timedelta(days=365)

# Format dates correctly for the Graph API in ISO 8601 format
start_date_str = start_date.strftime("%Y-%m-%dT%H:%M:%S%z")
end_date_str = end_date.strftime("%Y-%m-%dT%H:%M:%S%z")

# Insert colon in timezone offset
start_date_str = start_date_str[:-2] + ":" + start_date_str[-2:]
end_date_str = end_date_str[:-2] + ":" + end_date_str[-2:]
print(f"Fetching events from {start_date_str} to {end_date_str}")

# Set up the request configuration with query parameters as a dictionary
query_params = CalendarViewRequestBuilder.CalendarViewRequestBuilderGetQueryParameters(
    start_date_time=start_date_str,
    end_date_time=end_date_str,
    select=['subject', 'start', 'end'],
    top=100,
    orderby=['start/dateTime ASC'],
    #filter="contains(subject, 'from HR Works')"
)

headers = HeadersCollection()
headers.add("Prefer", 'outlook.timezone="Europe/Berlin"')

request_configuration = RequestConfiguration(
    query_parameters=query_params,
    headers=headers
)

all_events = []

try:
    # Initial request
    events_page = await graph_client.users.by_user_id(user_id).calendars.by_calendar_id(calendar_id).events.get(request_configuration=request_configuration)
...

控制台输出显示获取2024-10-09T12:27:39+00:00至2025-10-09T12:27:39+00:00的事件,但返回结果中包含大量2023年的事件(如2023-10-13的缺勤事件)。尝试调整时间戳但问题未解决,查阅官方文档也无帮助;不过在Graph Explorer中直接调用API的日期参数可正常工作。

解决方案

问题核心是调用的方法错误:你配置了CalendarView的查询参数,但实际调用的是通用的.events.get()接口,而非CalendarView专属接口。

  • 原因:.events.get()会返回日历内所有事件(含重复事件实例、历史事件),不会识别start_date_time和end_date_time参数,这些参数仅在调用CalendarView接口时生效。
  • 修正代码:将请求行替换为CalendarView专属方法:
    events_page = await graph_client.users.by_user_id(user_id).calendars.by_calendar_id(calendar_id).calendar_view.get(request_configuration=request_configuration)
    

另外,日期格式化可以简化,无需手动拼接时区冒号,直接使用datetime的isoformat()方法:

start_date_str = start_date.isoformat()
end_date_str = end_date.isoformat()

该方法会直接生成符合ISO 8601标准的格式(如2024-10-09T12:27:39+00:00),省去字符串手动处理步骤。

内容的提问来源于stack exchange,提问作者Softwareentwicklung Freelancer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:29:53