/// <summary> /// Converts this time zone definition into a TimeZoneInfo structure. /// </summary> /// <returns>A TimeZoneInfo representing the same time zone as this definition.</returns> internal TimeZoneInfo ToTimeZoneInfo() { this.Validate(); TimeZoneInfo result; // Retrieve the base offset to UTC, standard and daylight display names from // the last transition group, which is the one that currently applies given that // transitions are ordered chronologically. TimeZoneTransitionGroup.CustomTimeZoneCreateParams creationParams = this.transitions[this.transitions.Count - 1].TargetGroup.GetCustomTimeZoneCreationParams(); List <TimeZoneInfo.AdjustmentRule> adjustmentRules = new List <TimeZoneInfo.AdjustmentRule>(); DateTime startDate = DateTime.MinValue; DateTime endDate; DateTime effectiveEndDate; for (int i = 0; i < this.transitions.Count; i++) { if (i < this.transitions.Count - 1) { endDate = (this.transitions[i + 1] as AbsoluteDateTransition).DateTime; effectiveEndDate = endDate.AddDays(-1); } else { endDate = DateTime.MaxValue; effectiveEndDate = endDate; } TimeZoneInfo.AdjustmentRule adjustmentRule = this.transitions[i].TargetGroup.CreateAdjustmentRule(startDate, effectiveEndDate); if (adjustmentRule != null) { adjustmentRules.Add(adjustmentRule); } startDate = endDate; } if (adjustmentRules.Count == 0) { // If there are no adjustment rule, the time zone does not support Daylight // saving time. result = TimeZoneInfo.CreateCustomTimeZone( this.Id, creationParams.BaseOffsetToUtc, this.Name, creationParams.StandardDisplayName); } else { result = TimeZoneInfo.CreateCustomTimeZone( this.Id, creationParams.BaseOffsetToUtc, this.Name, creationParams.StandardDisplayName, creationParams.DaylightDisplayName, adjustmentRules.ToArray()); } return(result); }
/// <summary> /// Converts this time zone definition into a TimeZoneInfo structure. /// </summary> /// <param name="service">The service.</param> /// <returns>A TimeZoneInfo representing the same time zone as this definition.</returns> internal Misc.CustomTimeZoneInfo ToTimeZoneInfo(ExchangeService service) { this.Validate(); Misc.CustomTimeZoneInfo result; // Retrieve the base offset to UTC, standard and daylight display names from // the last transition group, which is the one that currently applies given that // transitions are ordered chronologically. TimeZoneTransitionGroup.CustomTimeZoneCreateParams creationParams = this.transitions[this.transitions.Count - 1].TargetGroup.GetCustomTimeZoneCreationParams(); List <Misc.AdjustmentRule> adjustmentRules = new List <Misc.AdjustmentRule>(); DateTime startDate = DateTime.MinValue; DateTime endDate; DateTime effectiveEndDate; for (int i = 0; i < this.transitions.Count; i++) { if (i < this.transitions.Count - 1) { endDate = (this.transitions[i + 1] as AbsoluteDateTransition).DateTime; effectiveEndDate = endDate.AddDays(-1); } else { endDate = DateTime.MaxValue; effectiveEndDate = endDate; } // OM:1648848 Due to bad timezone data from clients the // startDate may not always come before the effectiveEndDate if (startDate < effectiveEndDate) { Misc.AdjustmentRule adjustmentRule = this.transitions[i].TargetGroup.CreateAdjustmentRule(startDate, effectiveEndDate); if (adjustmentRule != null) { adjustmentRules.Add(adjustmentRule); } startDate = endDate; } else { service.TraceMessage( TraceFlags.EwsTimeZones, string.Format( "The startDate '{0}' is not before the effectiveEndDate '{1}'. Will skip creating adjustment rule.", startDate, effectiveEndDate)); } } if (adjustmentRules.Count == 0) { // If there are no adjustment rule, the time zone does not support Daylight // saving time. result = Misc.CustomTimeZoneInfo.CreateCustomTimeZone( this.Id, creationParams.BaseOffsetToUtc, this.Name, creationParams.StandardDisplayName); } else { result = Misc.CustomTimeZoneInfo.CreateCustomTimeZone( this.Id, creationParams.BaseOffsetToUtc, this.Name, creationParams.StandardDisplayName, creationParams.DaylightDisplayName, adjustmentRules.ToArray()); } return(result); }