私は Nodatime を使用して世界時計をプログラムしようとしています。ライブラリの使用方法に関するサンプルを Web で検索し、ドキュメントを読みました。クラス Instant は、いくつかの任意のepoch 1970 年 1 月 1 日 UTC の真夜中に対応する Unix エポック。まあ、私は経験的に、インスタントとして GMT 値を使用すると、それを使用して各タイム ゾーンの時間値を計算し (世界時計を作成)、うまくいくと推測しました。私が抱えている問題は、現地時間から GMT 時間 (または GMT インスタント) を計算する簡単な方法がわからないことです。私のタイムゾーンは「America/Mexico_City」なので、近道はありますか? "
1 に答える
nowを表す「現在の」インスタントを探しているだけの場合は、次を使用します。
Instant now = SystemClock.Instance.Now;
Instant
このタイプはタイムゾーンに関係なく普遍的な瞬間を表しているため、「GMT インスタント」と呼ぶのは冗長です。これは (ほとんど) UTC と同等です。これは本質的に GMT と同じです。つまり、 GMT以外の を作成するInstant
ことはできませんでした。
について考える別の方法Instant
は、プロパティが永続的に固定され、他のものを表すことができない であるかDateTime
の.Kind
ようDateTimeKind.Utc
に考えることです。
また、アプリケーションの設計方法によっては、IClock
代わりにインターフェースを使用すると便利な場合があります。
IClock clock = SystemClock.Instance;
Instant now = clock.Now;
これにより、単体テスト中にシステム クロックを偽のクロックに置き換えることができます。
特定の現地時間から に移動する方法については、次のInstant
ようにします。
LocalDateTime ldt = new LocalDateTime(2013, 1, 1, 0, 0, 0);
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Mexico_City"];
ZonedDateTime zdt = ldt.InZoneLeniently(tz);
Instant instant = zdt.ToInstant();
InZoneLeniently
変換で使用したことに注意してください。これは、夏時間のために無効またはあいまいな現地時間から変換する方法について、特定の仮定を行います。これは受け入れられるかもしれませんが、代わりにInZoneStrictly
例外をスローするものを使用したりInZone
、独自のロジックを提供できるようにリゾルバー関数を渡すことができるものを使用したりすることを好むかもしれません。