Microsoft Graph 事件资源类型:更新开始和结束日期时间问题

Microsoft Graph Event Resource type: Updating Start and End datetime issue

我正在使用 Microsoft Graph .NET SDK 更新 outlook 事件。以下代码正确更新了日期,但它更新了 StartEnd 时间,晚了四个小时。当我转到我的 Outlook 日历时,它显示更改时间为 04:30 开始和 05:30 结束 instead of 显示 08:30 开始和 09:30 结束. 问题:为什么? 备注:我在美国东部时区,但我不认为这段代码与它有任何关系,除非我在这里遗漏了什么。

代码:

authProvider"{id}" 变量的值与问题无关,因为具有实际值的代码可以正常工作,因为它确实会无错误地更新事件。

.....
GraphServiceClient graphClient = new GraphServiceClient( authProvider );
    
var @event = new Event
{
    Subject = "Test subject",
    Body= new ItemBody { Content = "Test body content"}
    Start = new DateTimeTimeZone { DateTime = "2020-08-29T08:30:00.0000000", TimeZone = "UTC" }
    End = new DateTimeTimeZone { DateTime = "2020-08-29T09:30:00.0000000", TimeZone = "UTC" }
};
await graphClient.Me.Events["{id}"]
    .Request()
    .UpdateAsync(@event);

如果您更新约会并将时区设置为 UTC,然后查看 Outlook 时区为东部的同一约会,那么该行为听起来是正确的。作为一般规则,您应该检查约会的时区(或您修改的邮箱),然后在您的更新中匹配它(特别是如果您处理多个时区)。可以影响时区的另一件事是 Outlook.Prefer Header https://docs.microsoft.com/en-us/graph/api/user-list-events?view=graph-rest-1.0&tabs=http 例如设置这个

        List<Option> options = new List<Option> { new HeaderOption("Prefer", "outlook.timezone=\"Eastern Time\"") };

        await graphClient.Me.Events["{id}"]
            .Request(options)
            .UpdateAsync(@event);

额外

好的,这是我创建的一个快速单元测试,它创建一个约会然后更新它。在 Outlook 中,这显示了东部标准时间更正后的更新日期时间。如果我在活动详细信息中用 UTC 代替东部标准时间,那么它会将会议时区更改为 UTC,因此也会改变时间(如果您在活动中使用 UTC,我认为这是您的问题)。我建议您使用 Outlook 桌面客户端查看约会,它会向您显示与约会关联的时区,网络客户端只为您提供调整后的值。

            List<Option> options = new List<Option> { new HeaderOption("Prefer", "outlook.timezone=\"Eastern Standard Time\"") };
        DateTimeTimeZone start = new DateTimeTimeZone { DateTime = "2020-08-29T08:30:00.0000000", TimeZone = "UTC" };
        var @event = new Event
        {
            Subject = "Test subject",
            Body = new ItemBody { Content = "Test body content" },
            Start = new DateTimeTimeZone { DateTime = "2020-08-29T07:30:00.0000000", TimeZone = "Eastern Standard Time" },
            End = new DateTimeTimeZone { DateTime = "2020-08-29T08:30:00.0000000", TimeZone = "Eastern Standard Time" }
        };
        var newEvent = await GraphServiceClient.Me.Events
            .Request(options)
            .AddAsync(@event);
        @event = new Event
        {
            Subject = "Updated subject",
            Body = new ItemBody { Content = "Test body content" },
            Start = new DateTimeTimeZone { DateTime = "2020-08-29T08:30:00.0000000", TimeZone = "Eastern Standard Time" },
            End = new DateTimeTimeZone { DateTime = "2020-08-29T09:30:00.0000000", TimeZone = "Eastern Standard Time" }
        };
        await GraphServiceClient.Me.Events[newEvent.Id]
       .Request(options)
       .UpdateAsync(@event);