2012-06-12 4 views
1

В моем коде я пытаюсь обрабатывать ZoneLocalMapping.ResultType.Abiguous. ЛинияКак правильно обрабатывать ZoneLocalMapping.ResultType.Ametiguous?

unambiguousLocalDateTime = localDateTimeMapping.EarlierMapping; 

выбрасывает InvalidOperationException с сообщением «EarlierMapping свойство не должно быть названо в результате типа неоднозначные».

У меня нет ни малейшего понятия, как мне с этим справиться. Можете ли вы привести мне пример?

Это то, что мой код выглядит следующим образом:

public Instant getInstant(int year, int month, int day, int hour, int minute) 
{ 
     var localDateTime = new LocalDateTime(year, month, day, hour, minute); //invalidated, might be not existing 
     var timezone = DateTimeZone.ForId(TimeZoneId); //TimeZone is set elsewhere, example "Brazil/East" 
     var localDateTimeMapping = timezone.MapLocalDateTime(localDateTime); 
     ZonedDateTime unambiguousLocalDateTime; 
     switch (localDateTimeMapping.Type) 
     { 
      case ZoneLocalMapping.ResultType.Unambiguous: 
       unambiguousLocalDateTime = localDateTimeMapping.UnambiguousMapping; 
       break; 
      case ZoneLocalMapping.ResultType.Ambiguous: 
       unambiguousLocalDateTime = localDateTimeMapping.EarlierMapping; 
       break; 
      case ZoneLocalMapping.ResultType.Skipped: 
       unambiguousLocalDateTime = new ZonedDateTime(localDateTimeMapping.ZoneIntervalAfterTransition.Start, timezone); 
       break; 
      default: 
       throw new InvalidOperationException(string.Format("Unexpected mapping result type: {0}", localDateTimeMapping.Type)); 
     } 
     return unambiguousLocalDateTime.ToInstant(); 
} 

Если я смотрю на класс ZoneLocalMapping я вижу следующий код:

/// <summary> 
    /// In an ambiguous mapping, returns the earlier of the two ZonedDateTimes which map to the original LocalDateTime. 
    /// </summary> 
    /// <exception cref="InvalidOperationException">The mapping isn't ambiguous.</exception> 
    public virtual ZonedDateTime EarlierMapping { get { throw new InvalidOperationException("EarlierMapping property should not be called on a result of type " + type); } } 

Вот почему я получаю исключение, но то, что я должен сделать, чтобы получить раннее копирование?

ответ

2

Похоже, вы используете относительно старую сборку. ZoneLocalMapping немного изменилось с тех пор, и я подозреваю, что исправил найденную вами ошибку. Вот пример, который работает:

using System; 
using NodaTime; 

class Program 
{  
    public static void Main() 
    { 
     var local = new LocalDateTime(2012, 10, 28, 1, 30, 0); 
     var zone = DateTimeZone.ForId("Europe/London"); 
     var mapping = zone.MapLocal(local); 

     Console.WriteLine(mapping.Count); // 2 
     Console.WriteLine(mapping.First()); // 1.30 with offset +1 
     Console.WriteLine(mapping.Last()); // 1.30 with offest +0 
    }  
} 

Ваш фактический метод может уйти полностью в настоящее время, в связи с улучшением «распознаватель» API. Теперь вы можете использовать:

private static readonly ZoneLocalResolver CustomResolver = 
    Resolvers.CreateMappingResolver(Resolvers.ReturnEarlier, 
            Resolvers.ReturnStartOfIntervalAfter); 

... 

Instant instant = zone.ResolveLocal(localDateTime, CustomResolver).ToInstant(); 
+0

Прохладный! Большое спасибо. – RWC

+0

(В данный момент) последний источник можно найти здесь: http://code.google.com/p/noda-time/source/checkout – RWC

Смежные вопросы