使用Microsoft Graph API获取Outlook365重复日历事件时endDate返回0001-01-01问题
这个情况其实是Graph API处理重复事件的正常逻辑,别慌,我帮你梳理下原因和解决办法:
首先得明白:重复事件的主条目(series master event)本身的endDate并不是重复系列的实际结束日期,Graph API把重复规则的结束信息单独放在了recurrence对象里,主事件的endDate默认会返回0001-01-01这个占位值,不管是无结束日期、次数限定还是固定结束日期的重复系列都是如此。
接下来是具体的处理方案:
区分主事件和实例,读取正确的结束信息
先检查事件的isRecurring字段:如果是true,说明这是重复事件的主条目,此时你需要从recurrence.range里取对应的结束规则:- 无结束日期的重复:
recurrence.range.type为noEnd,意味着这个重复系列不会自动结束 - 次数限定型重复:
recurrence.range.type为numbered,查看recurrence.range.numberOfOccurrences就能知道总共有多少个实例,你也可以通过重复规则计算出最后一个实例的日期 - 固定结束日期的重复:
recurrence.range.type为endDate,此时recurrence.range.endDate就是这个重复系列的实际结束日期
- 无结束日期的重复:
直接获取所有重复实例的具体日期(可选)
如果你不想自己计算,也可以在请求里加上$expand=occurrences参数,让Graph API返回每个重复实例的具体信息,每个实例的end.dateTime都会显示正确的结束时间。比如这个请求:GET /me/events?$expand=occurrences($top=100)注意:如果重复事件数量很多,记得用
$top和分页来控制返回的实例数,避免请求超时。留意例外事件
有些修改过的重复实例(例外事件)的endDate是正常显示的,但主事件依然会返回0001-01-01,所以判断是否为重复事件一定要以isRecurring字段为准,不要只看日期值。
举个直观的例子,主事件的recurrence结构大概是这样的:
"recurrence": { "pattern": { "type": "weekly", "interval": 1, "daysOfWeek": ["monday"], "firstDayOfWeek": "sunday" }, "range": { "type": "endDate", "startDate": "2024-01-01", "endDate": "2024-12-31", "numberOfOccurrences": null } }
这里的range.endDate才是重复系列的真正结束日期,主事件的end.date那个0001-01-01可以直接忽略掉。
内容的提问来源于stack exchange,提问作者Shivansh Rawat

