2

私は入力として持っています:

  1. 時刻(午前8時)
  2. オルソン タイムゾーン (アメリカ/ニューヨーク)

時刻を別のオルソン タイムゾーン (アメリカ/ロサンゼルス) に変換する必要があります。

.net または nodatime でその変換を行う最善の方法は何ですか。基本的に、C# でこのメソッドに相当するものを探しています。

  var timeInDestinationTimeZone = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(CurrentSlot.Date, TimeZoneInfo.Local.Id,
                                                                            room.Location.TimeZone.TimeZoneName);

しかし、上記のこの.Netメソッドは、Windowsタイムゾーン名でのみ機能します(そして、私はオルソン名を持っています)

4

2 に答える 2

4

観察:

var tzdb = DateTimeZoneProviders.Tzdb;

var zone1 = tzdb["America/New_York"];
var ldt1 = new LocalDateTime(2013, 3, 4, 8, 0); // March 4th, 2013 - 8:00 AM
var zdt1 = zone1.AtLeniently(ldt1);

var zone2 = tzdb["America/Los_Angeles"];
var zdt2 = zdt1.ToInstant().InZone(zone2);
var ldt2 = zdt2.LocalDateTime;

の呼び出しに注意してくださいAtLeniently- それは、あなたが話している瞬間を完全に確信するのに十分な情報がないからです。たとえば、DST フォールバック トランジションの日の午前 1 時 30 分について話している場合、それがトランジションの前後について話しているかどうかはわかりません。 は、 の後でAtLeniently意図した仮定を行います。その動作が望ましくない場合は、オフセットを指定して、話している現地時間を知る必要があります。

実際の変換ToInstantは、あなたが話しているUTCの瞬間を取得しInZoneてから、それをターゲットゾーンに適用することによって行われています。

于 2013-03-04T23:59:33.693 に答える
3

マットの(完全に良い)回答の2番目の部分に代わるもの:

// All of this part as before...
var tzdb = DateTimeZoneProviders.Tzdb;    
var zone1 = tzdb["America/New_York"];
var ldt1 = new LocalDateTime(2013, 3, 4, 8, 0); // March 4th, 2013 - 8:00 AM
var zdt1 = zone1.AtLeniently(ldt1);

var zone2 = tzdb["America/Los_Angeles"];

// This is just slightly simpler - using WithZone, which automatically retains
// the calendar of the existing ZonedDateTime, and avoids having to convert
// to Instant manually
var zdt2 = zdt1.WithZone(zone2);
var ldt2 = zdt2.LocalDateTime;
于 2013-03-05T04:35:40.180 に答える