今天我遇到了一个非常类似的问题,但是在更新事件时。我相信我的解决方案与这个问题有关。
我正在更新在中欧时区创建的事件。 我的代码是按以下顺序设置属性:
appt.Start = DateTime.UtcNow;
appt.End = DateTime.UtcNow.AddMinutes(30);
appt.StartTimeZone = TimeZoneInfo.FindSystemTimeZoneById("UTC");
appt.EndTimeZone = TimeZoneInfo.FindSystemTimeZoneById("UTC");
与托管API的工作,我的印象是财产分配的顺序对实际操作没有影响下,但是在这种情况下,我发现它不是真的。
托管API生成以下XML:
<soap:Body>
<m:UpdateItem ConflictResolution="AlwaysOverwrite" SendMeetingInvitationsOrCancellations="SendToNone">
<m:SavedItemFolderId>
<t:FolderId Id="AQMkADJkAAA==" />
</m:SavedItemFolderId>
<m:ItemChanges>
<t:ItemChange>
<t:ItemId Id="AAMkADJkZWZiODMxLWNRE" />
<t:Updates>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:EndTimeZone" />
<t:CalendarItem>
<t:EndTimeZone Name="UTC" Id="UTC">
...
</t:EndTimeZone>
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:Start" />
<t:CalendarItem>
<t:Start>2015-10-19T15:30:00.000Z</t:Start>
</t:CalendarItem>
</t:SetItemField>
<t:SetItemField>
<t:FieldURI FieldURI="calendar:End" />
<t:CalendarItem>
<t:End>2015-10-19T16:00:00.000Z</t:End>
</t:CalendarItem>
</t:SetItemField>
...
<t:SetItemField>
<t:FieldURI FieldURI="calendar:StartTimeZone" />
<t:CalendarItem>
<t:StartTimeZone Name="UTC" Id="UTC">
...
</t:StartTimeZone>
</t:CalendarItem>
</t:SetItemField>
</t:Updates>
</t:ItemChange>
</m:ItemChanges>
</m:UpdateItem>
</soap:Body>
交换财产分配的顺序首先设置时区解决了这一问题对我来说。
当事件的原始时区等于设置的时区时,也不会发生问题。只是在切换时区时。
请注意,这不是真正的解决方案。更好的方法是克隆托管API并修复库中的问题。