/// <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);
        }