重要な点が1つもありません:の種類がLocal
である場合は、必ずしも固有の瞬間を完全に表すとは限りません。そのため、Instant
への直接マッピングはありません。
フォールバックのDSTトランジションでは、ローカルDateTime
は2つの可能な瞬間のいずれかを表すことができます。 Instant
に変換する場合は、選択する必要がある瞬間を決める必要があります。あなたが与えた答えで
、私はあなたが以下のいずれかからtimezone
を得たと仮定しています:
var timezone = DateTimeZoneProviders.Tzdb.GetSystemDefault();
または
var timezone = DateTimeZoneProviders.Bcl.GetSystemDefault();
のどちらかが、このタスクのためにOKです。そして、あなたが与えたコード:
var localTime = LocalDateTime.FromDateTime(time);
var zonedTime = localTime.InZoneStrictly(timeZone);
return zonedTime.ToInstant();
これはまさに正しいですが、InZoneStrictly
を使用するので、あなたは、フォールバック遷移中AmbiguousTimeException
を取得します。
次の2つの可能性(通常は「標準」時間)の後者を選ぶであろう、InZoneLeniently
を使用することによって、これを回避することができます。しかし、もっと重要なのは、あなたの代わりにInZone
を使用して、より正確に動作を制御するために、標準またはカスタムresolverのいずれかを提供することができます。
の元のアプローチについて:
Instant.FromDateTimeUtc(time.ToUniversalTime())
これはokですし、データ破損していないだろうが、それは普遍的変換に地元のBCLの動作に依存することを理解しています。あいまいな値が「標準」時間として扱われる点でInZoneLeniently
と同じです。
NodaTimeがより正確なAPIを提供する方法の素晴らしい例です。前提を作るのではなく、具体的な行動をとる機会があります。最終的に同じ結果が得られましたが、それを隠すのではなく、前景にこの問題をもたらしました。
これを説明する時間をとってくれてありがとう。私はこれが、図書館を初めて知り尽くした他の人々に役立つと思います。 – Sam