/// <summary> /// Adds a recurring savings rule to the time zone builder. /// </summary> /// <param name="builder">The <see cref="DateTimeZoneBuilder" /> to add to.</param> /// <param name="nameFormat">The name format pattern.</param> /// <param name="ruleSet">The <see cref="ZoneRecurrenceCollection" /> describing the recurring savings.</param> private static void AddRecurring(DateTimeZoneBuilder builder, String nameFormat, IEnumerable<ZoneRule> ruleSet) { foreach (var rule in ruleSet) { builder.AddRecurringSavings(rule.FormatName(nameFormat), rule.Recurrence.Savings, rule.Recurrence.FromYear, rule.Recurrence.ToYear, rule.Recurrence.YearOffset.Mode, rule.Recurrence.YearOffset.MonthOfYear, rule.Recurrence.YearOffset.DayOfMonth, rule.Recurrence.YearOffset.DayOfWeek, rule.Recurrence.YearOffset.AdvanceDayOfWeek, rule.Recurrence.YearOffset.TickOfDay); } }
/// <summary> /// Returns a newly created <see cref="DateTimeZone" /> built from the given time zone data. /// </summary> /// <param name="zoneList">The time zone definition parts to add.</param> /// <param name="ruleSets">The rule sets map to use in looking up rules for the time zones..</param> private static DateTimeZone CreateTimeZone(ZoneList zoneList, IDictionary<string, IList<ZoneRule>> ruleSets) { var builder = new DateTimeZoneBuilder(); foreach (var zone in zoneList) { builder.SetStandardOffset(zone.Offset); if (zone.Rules == null) { builder.SetFixedSavings(zone.Format, Offset.Zero); } else { try { // Check if iRules actually just refers to a savings. var savings = ParserHelper.ParseOffset(zone.Rules); builder.SetFixedSavings(zone.Format, savings); } catch (FormatException) { var rs = ruleSets[zone.Rules]; if (rs == null) { throw new ArgumentException("Rules not found: " + zone.Rules); } AddRecurring(builder, zone.Format, rs); } } if (zone.Year == Int32.MaxValue) { break; } builder.AddCutover(zone.Year, TransitionMode.Wall, zone.MonthOfYear, zone.DayOfMonth, 0, true, zone.TickOfDay); } return builder.ToDateTimeZone(zoneList.Name); }