问题描述
我正在使用Microsoft Graph .NET SDK更新Outlook事件。以下代码正确地更新了日期,但是将Start
和End
时间更新了四个小时。当我转到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);
解决方法
如果您更新约会并将TimeZone设置为UTC,然后查看与Eastern的Outlook时区相同的约会,则该行为听起来是正确的。通常,您应该检查约会的时区(或您正在修改的邮箱),然后在更新中进行匹配(尤其是在处理多个时区时)。可能会影响时区的另一件事是Outlook.Prefer标头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 Desktop客户端的约会,它还会向您显示与约会关联的TimeZone,其中Web客户端只为您提供调整后的值。
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",Start = new DateTimeTimeZone { DateTime = "2020-08-29T08:30:00.0000000",End = new DateTimeTimeZone { DateTime = "2020-08-29T09:30:00.0000000",TimeZone = "Eastern Standard Time" }
};
await GraphServiceClient.Me.Events[newEvent.Id]
.Request(options)
.UpdateAsync(@event);