1

私のコードでは、ZoneLocalMapping.ResultType.Ambiguous を処理しようとしています。この線

unambiguousLocalDateTime = localDateTimeMapping.EarlierMapping;

「Ambiguous 型の結果に対して EarlyMapping プロパティを呼び出さないでください」というメッセージとともに InvalidOperationException をスローします。

どのように対処すればよいかわかりません。例を教えてください。

これは私のコードがどのように見えるかです:

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

そのため、例外が発生していますが、EarlierMapping を取得するにはどうすればよいですか?

4

1 に答える 1

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();
于 2012-06-12T12:53:03.103 に答える