EWS返回"自定义时区" - 如何在SQL中存储它?

时间:2016-06-08 12:40:01

标签: c# timezone exchangewebservices

使用EWS GetUserAvailability()函数时,我在AttendeesAvailability[i]对象中加入一个包含Start,End,WeekDays和TimeZoneInfo对象的WorkingHours对象。

对我来说,TimeZoneInfo对象的名称始终为Custom Timezone,GUID为ID,因此我无法使用FindSystemTimeZoneById恢复同一时区。

但是,用户可以为其可用性选择的时区是系统时区之一,因此我真的希望找到此处返回的系统时区。如何从EWS中找到用户在其Outlook或OWA帐户设置中选择的系统时区?

如果我不能,在SQL服务器中存储TimeZoneInfo对象的适当方法是什么?

1 个答案:

答案 0 :(得分:0)

我发现问题是EWS XML格式。可以看出here,它不包含完整的时区信息(例如名称),只包含一个子集:

  <TimeZone>
    <Bias>480</Bias>
    <StandardTime>
      <Bias>0</Bias>
      <Time>02:00:00</Time>
      <DayOrder>5</DayOrder>
      <Month>10</Month>
      <DayOfWeek>Sunday</DayOfWeek>
    </StandardTime>
    <DaylightTime>
      <Bias>-60</Bias>
      <Time>02:00:00</Time>
      <DayOrder>1</DayOrder>
      <Month>4</Month>
      <DayOfWeek>Sunday</DayOfWeek>
    </DaylightTime>
  </TimeZone>

然后将此子集解析回时区in this EWS Managed API code,这个真正有用的Guid“Id”(每次调用GetUserAvailability时Id都不同,尽管时区仍然相同) :

return TimeZoneInfo.CreateCustomTimeZone(
    Guid.NewGuid().ToString(),
    -this.bias,
    "Custom time zone",
    "Standard time",
    "Daylight time",
    new TimeZoneInfo.AdjustmentRule[] { adjustmentRule });

所以我想我可以预期,在99%的情况下,我会在可用系统时区列表中找到一个或多个匹配的时区,我现在使用扩展方法:

public static TimeZoneInfo ToSystemTimeZone(this TimeZoneInfo customTimeZone)
{
    var tz = TimeZoneInfo.GetSystemTimeZones().FirstOrDefault(x => x.HasSameRules(customTimeZone));
    if (tz != null) return tz;
    else return customTimeZone;
}

这提供了第一个系统时区,其规则与自定义时区相同。它不是100%匹配,因为可能有多个时区具有相同的规则,但至少这应该保留通过EWS公开的所有时区信息。