使用EWS GetUserAvailability()
函数时,我在AttendeesAvailability[i]
对象中加入一个包含Start,End,WeekDays和TimeZoneInfo
对象的WorkingHours
对象。
对我来说,TimeZoneInfo
对象的名称始终为Custom Timezone
,GUID为ID,因此我无法使用FindSystemTimeZoneById
恢复同一时区。
但是,用户可以为其可用性选择的时区是系统时区之一,因此我真的希望找到此处返回的系统时区。如何从EWS中找到用户在其Outlook或OWA帐户设置中选择的系统时区?
如果我不能,在SQL服务器中存储TimeZoneInfo
对象的适当方法是什么?
答案 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公开的所有时区信息。