2013-04-19 1 views
1

У меня есть NodaTime код, который смотрит на интервалы зоны:Как представить EOT по местному времени?

var zone = DateTimeZoneProviders.Tzdb["America/Phoenix"]; 
var interval = zone.GetZoneInterval(SystemClock.Instance.Now); 
Console.WriteLine(interval.End); 
Console.WriteLine(interval.IsoLocalEnd); 

interval.End выходы EOT, которая, как ожидается, так как эта зона не используется летнее время. Но я не могу вывести значение interval.IsoLocalEnd. Он выдает исключение:

System.ArgumentOutOfRangeException was unhandled 
    HResult=-2146233086 
    Message=Value should be in range [-27255-31195] 
Parameter name: year 
Actual value was 31197. 
    Source=NodaTime 
    ParamName=year 
    StackTrace: 
     at NodaTime.Utility.Preconditions.CheckArgumentRange(String paramName, Int32 value, Int32 minInclusive, Int32 maxInclusive) 
     at NodaTime.Calendars.BasicCalendarSystem.GetYearTicks(Int32 year) 
     at NodaTime.Calendars.GregorianCalendarSystem.GetYearTicks(Int32 year) 
     at NodaTime.Calendars.BasicGJCalendarSystem.GetMonthOfYear(LocalInstant localInstant, Int32 year) 
     at NodaTime.Calendars.BasicCalendarSystem.GetMonthOfYear(LocalInstant localInstant) 
     at NodaTime.Fields.BasicMonthOfYearDateTimeField.GetValue(LocalInstant localInstant) 
     at NodaTime.LocalDateTime.get_Month() 
     at NodaTime.Text.LocalDateTimePatternParser.<.cctor>b__8(LocalDateTime value) 
     at NodaTime.Text.Patterns.DatePatternHelper.<>c__DisplayClassd`2.<>c__DisplayClass10.<CreateMonthOfYearHandler>b__c(TResult value, StringBuilder sb) 
     at NodaTime.NodaAction`2.Invoke(TArg1 arg1, TArg2 arg2) 
     at NodaTime.Text.Patterns.SteppedPatternBuilder`2.SteppedPattern.Format(TResult value) 
     at NodaTime.Text.Patterns.PatternBclSupport`1.Format(T value, String patternText, NodaFormatInfo formatInfo) 
     at NodaTime.LocalDateTime.ToString(String patternText, IFormatProvider formatProvider) 
     at System.IO.TextWriter.WriteLine(Object value) 
     at System.IO.TextWriter.SyncTextWriter.WriteLine(Object value) 

Это ошибка? Или это ожидаемое поведение, и я должен проверить interval.End == Instant.MaxValue, прежде чем пытаться использовать значение interval.IsoLocalEnd?

Я использую NodaTime 1.1.0.

ответ

3

В общем, у Noda Time есть некоторые проблемы с преобразованием моментов в локальные даты в точках, близких к (или в) в конце времени. См. issue 197 и issue 113. Это, по-видимому, является другим возникновением такой же проблемы.

Я предлагаю подать ошибку. Одно из предложений: проверьте, видите ли вы те же результаты с Noda Time 1.0: исправление для проблемы 197 (в версии 1.1.0), возможно, могло вызвать это как регрессию.

+0

Подано [215] (https://code.google.com/p/noda-time/issues/detail?id=215). Благодарю. –

+0

Это, конечно же, хуже - «Instant.MaxValue» означает «EOT», но вы можете вычесть из него один тик, чтобы получить мгновенный момент, который является очень определенным моментом на временной линии. В идеальном мире мы, вероятно, хотели бы что-то ближе к IEEE-754, где бесконечность остается бесконечной. Это определенно один из слабых аспектов Noda Time. –