private IEnumerable <TimeZoneImplementation> GetTimeZoneImplementations(Guid timeZoneId, TzDbZoneDefinition tzDbZoneDefinition, IEnumerable <IGrouping <string, TzDbRule> > tzDbRuleGroups) { // get the daylightSavingsAdjustment for the current zone AbstractDaylightSavingsAdjustment offsetAdjustment = FindOrCreateDaylightSavingsAdjustment(tzDbZoneDefinition.Zone.Rules, tzDbRuleGroups); var timeZoneImplementations = new List <TimeZoneImplementation> { tzDbZoneDefinition.Zone.ToTimeZoneImplementation(offsetAdjustment) }; // process the zone continuations for the current zone foreach (TzDbZoneContinuation tzDbZoneContinuation in tzDbZoneDefinition.ContinuationLines) { AbstractDaylightSavingsAdjustment zoneContinuationOffsetAdjustment = FindOrCreateDaylightSavingsAdjustment(tzDbZoneContinuation.Rules, tzDbRuleGroups); // create a TimeZoneImplementation from this zone definitions zone continuation timeZoneImplementations.Add( tzDbZoneContinuation.ToTimeZoneImplementation(zoneContinuationOffsetAdjustment)); } return(timeZoneImplementations); }
private IEnumerable <TimeZoneAlias> FindTimeZoneAliases(TzDbZoneDefinition tzDbZoneDefinition, IEnumerable <TzDbLink> tzDbLinks) { return (tzDbLinks.Where(tzDbLink => tzDbLink.LinkFrom == tzDbZoneDefinition.Zone.Name) .Select(tzDbLink => tzDbLink.ToTimeZoneAlias())); }
private TzDbZoneDescription FindTzDbZoneDescription(TzDbZoneDefinition tzDbZoneDefinition, IEnumerable <TzDbZoneDescription> tzDbZoneDescriptions, IEnumerable <TimeZoneAlias> aliases) { TzDbZoneDescription description = tzDbZoneDescriptions.SingleOrDefault( tzDbZoneDescription => tzDbZoneDescription.Tz == tzDbZoneDefinition.Zone.Name); if (null == description) { tzDbZoneDescriptions.SingleOrDefault( tzDbZoneDescription => aliases.Any(alias => alias.Name == tzDbZoneDescription.Tz)); } return(description); }
public static bool TryParse(Queue <Token> unProcessedTokens, out TzDbZoneDefinition tzDbZoneDefinition) { try { // the value of the first token of every zone entry is Zone TzDbZone?tzDbZone; if (ZoneExpression.TryParse(unProcessedTokens, out tzDbZone)) { // if Until column of zone line is null this zone has no continuation lines if (null == tzDbZone.Value.Until) { tzDbZoneDefinition = new TzDbZoneDefinition(tzDbZone.Value, new List <TzDbZoneContinuation>()); return(true); } // dequeue start of line token and discard unProcessedTokens.Dequeue(); var continuationLines = new List <TzDbZoneContinuation> { ZoneContinuationExpression.Parse(unProcessedTokens, tzDbZone.Value.Name) }; // keep parsing zone continuations until we hit one that has a null until column while (null != continuationLines.Last().Until) { // dequeue start of line token and discard unProcessedTokens.Dequeue(); continuationLines.Add(ZoneContinuationExpression.Parse(unProcessedTokens, tzDbZone.Value.Name)); } tzDbZoneDefinition = new TzDbZoneDefinition(tzDbZone.Value, continuationLines); return(true); } tzDbZoneDefinition = null; return(false); } catch (Exception e) { throw new Exception("Error occured while parsing zone definition", e); } }