通过 Graph API 更新递归会议的结束日期无效

Updating the end date of a recursive meeting via Graph API not working

我目前正在使用 Office Graph API 来处理用户日历会议。 如果使用“/subscriptions”请求创建、更新和删除事件,我已订阅接收通知! 我的用户使用的是里斯本时区(夏季 = UTC+1,冬季 = UTC)

当用户在 Office 365 中创建活动时,在我的应用程序方面,如果该活动是没有结束日期的递归会议,我会更新(通过图表 API)会议,以便它有一个结束日期。 [注意:我的申请规则之一是任何会议都不能超过 365 天。]

问题:该系列缩小到我通过 API 更新的结束日期,但时间留下了错误的时区。我已经尝试请求不带时区的 API 并且我已经请求使用时区 UTC 和时区 UTC +1 进行更新,但我总是遇到同样的问题。 office这边,经过我的更新,开会时间少了一个小时

下图是一个系列的例子,没有结束范围:

我在更新前获取了一些 child 会议,它是正确的。在葡萄牙,时间更改日是 2019-03-30,因此第 30 天从 10h00 UTC 开始,第 31 天 09:00 UTC:

在这里,我向 Office 365 发送请求以更新重复结束(结束日期):

发送更新请求后,我获取相同的 children 并且 2019-03-30 和 2019-03-31 都从 10h00 开始。 更新客户端日历后,会议的开始和结束时间有误:

我已经尝试在 Graph API recurrenctTImeZone: UTC, GMT Standard Time 字段中输入任何内容,我总是有相同的 return。我无法解决这个问题。

你知道哪里出了问题吗?

您实际上可以在请求的 header 中使用它

Prefer: outlook.timezone="Central Standard Time"

这样它就知道您要在哪个时区进行计算。有关此的更多文档,请参见此处 https://docs.microsoft.com/en-us/graph/api/user-list-events?view=graph-rest-1.0#support-various-time-zones

我不会在太平洋标准时区或 GMT 标准时区的用户中重现此行为。为清楚起见,我正在使用 Postman 进行所有测试,并且我没有使用 Jeremy 上面指出的 Prefer: outlook.timezone header。

我在太平洋时间下午 2 点为用户创建了一个每天没有结束的约会,即 22:00 UTC。另请注意,DST 在 3 月 10 日在该时区开始。如下所示,更新前后实例上的时间都是正确的。

我还为 GMT 标准时区中的用户重复了相同的事件序列(在 Outlook 网页版中这样配置):

我得到了这个用户完全相同的结果。

我建议您在修补重复时始终使用原始重复中的 recurrenceTimeZone。您可能已经通过最初使用 UTC 进行修补而破坏了重复。

在 Outlook 网页版中创建后获取事件

GET /me/events/{id}&$select=originalStartTimeZone,originalEndTimeZone,start,end,recurrence
{
  "id": "AAMkAGE1NWM...",
  "originalStartTimeZone": "Pacific Standard Time",
  "originalEndTimeZone": "Pacific Standard Time",
  "start": {
    "dateTime": "2019-01-24T22:00:00.0000000",
    "timeZone": "UTC"
  },
  "end": {
    "dateTime": "2019-01-24T22:30:00.0000000",
    "timeZone": "UTC"
  },
  "recurrence": {
    "pattern": {
      "type": "daily",
      "interval": 1,
      "month": 0,
      "dayOfMonth": 0,
      "firstDayOfWeek": "sunday",
      "index": "first"
    },
    "range": {
      "type": "noEnd",
      "startDate": "2019-01-24",
      "endDate": "0001-01-01",
      "recurrenceTimeZone": "Pacific Standard Time",
      "numberOfOccurrences": 0
    }
  }
}

修改前获取实例

注意 start/end 次的偏移。

GET /me/events/{id}/instances?startDateTime=2019-03-09T00:00:00&endDateTime=2019-03-11T00:00:00&
$select=originalStartTimeZone,originalEndTimeZone,start,end
{
  "value": [
    {
      "id": "AAMkAGE1NWM...",
      "originalStartTimeZone": "Pacific Standard Time",
      "originalEndTimeZone": "Pacific Standard Time",
      "start": {
        "dateTime": "2019-03-09T22:00:00.0000000",
        "timeZone": "UTC"
      },
      "end": {
        "dateTime": "2019-03-09T22:30:00.0000000",
        "timeZone": "UTC"
      }
    },
    {
      "@odata.etag": "W/\"bReRxUIs3kGIyXXcVJg69AAANf7nZQ==\"",
      "id": "AAMkAGE1NWM...",
      "originalStartTimeZone": "Pacific Standard Time",
      "originalEndTimeZone": "Pacific Standard Time",
      "start": {
        "dateTime": "2019-03-10T21:00:00.0000000",
        "timeZone": "UTC"
      },
      "end": {
        "dateTime": "2019-03-10T21:30:00.0000000",
        "timeZone": "UTC"
      }
    }
  ]
}

更新事件重复以添加结束日期

请注意,我将 recurrenceTimeZone 保留为与原始值相同的值。

PATCH /me/events/{id}

{
  "recurrence": {
    "pattern": {
      "type": "daily",
      "interval": 1,
      "month": 0,
      "dayOfMonth": 0,
      "firstDayOfWeek": "sunday",
      "index": "first"
    },
    "range": {
      "type": "endDate",
      "startDate": "2019-01-24",
      "endDate": "2020-01-23",
      "recurrenceTimeZone": "Pacific Standard Time",
      "numberOfOccurrences": 0
    }
  }
}

修改后获取实例

请注意 start/end 时间仍然正确移动。

GET /me/events/{id}/instances?startDateTime=2019-03-09T00:00:00&endDateTime=2019-03-11T00:00:00&
$select=originalStartTimeZone,originalEndTimeZone,start,end
{
  "value": [
    {
      "id": "AAMkAGE1NWM...",
      "originalStartTimeZone": "Pacific Standard Time",
      "originalEndTimeZone": "Pacific Standard Time",
      "start": {
        "dateTime": "2019-03-09T22:00:00.0000000",
        "timeZone": "UTC"
      },
      "end": {
        "dateTime": "2019-03-09T22:30:00.0000000",
        "timeZone": "UTC"
      }
    },
    {
      "@odata.etag": "W/\"bReRxUIs3kGIyXXcVJg69AAANf7nZQ==\"",
      "id": "AAMkAGE1NWM...",
      "originalStartTimeZone": "Pacific Standard Time",
      "originalEndTimeZone": "Pacific Standard Time",
      "start": {
        "dateTime": "2019-03-10T21:00:00.0000000",
        "timeZone": "UTC"
      },
      "end": {
        "dateTime": "2019-03-10T21:30:00.0000000",
        "timeZone": "UTC"
      }
    }
  ]
}

在多次尝试解决后,我得以与 Office 365 开发团队交谈,并对负面反馈感到惊讶。

他们指出,在这种特定情况下,Microsoft API Graph 中实际上存在一个未知错误,并且他们不保证解决此错误!

他们的建议是我们只针对这种情况使用Outlook Calendar API Rest API。 总之,由于 Microsoft 已经假设了这个未知错误,我将不得不在我的平台中实现 2 个不同的 API:Microsoft 当前推荐的 Microsoft Graph API,以及 Outlook Calendar Rest API 因为这个错误。

Outlook 日历API 休息解决方案:

  1. 创建一个没有结束日期的重复事件

  1. 检索日历视图

  1. 获取事件的重复发生

  1. 更新活动

  1. 更新后检索日历视图