1

DateTime異なるタイムゾーンに正しく変換する方法を理解するのに問題があります。

DateTimeたとえば、 EST の 10:00 (軍事) をDateTimeUTCに変換したいとします。

ここに私が試すものがあります:

DateTime unspecified = new DateTime(2013, 8, 15, 10, 0, 0, DateTimeKind.Unspecified);
var utc = TimeZoneInfo.ConvertTime(unspecified, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"), TimeZoneInfo.Utc);

... UTC でも現地時間でもないため、 で構成DateTimeします (EST 10:00 です)。次に、これをTimeZoneInfo.ConvertTimeDateTimeKind.Unspecifiedに渡し、これがEST にあり、UTC に変換したいことを伝えます。DateTime

EST は協定世界時 (UTC) から 5 時間遅れているためutc、に等しいと予想されますが{15.08.2013 15:00:00}、上記のコードを実行すると、何らかの理由で取得されます{15.08.2013 14:00:00}(つまり、時差は4 時間です)。

質問は次のとおりです。なぜですか。これはある種の昼間の時間の問題ですか?もしそうなら - 昼間の節約時間を考慮せずにこの変換を取得するにはどうすればよいですか?

4

3 に答える 3

1

の付いた Windows タイム ゾーンは、EST だけのものではありませんId"Eastern Standard Time"EST (-5) と EDT (-4) の両方をカバーしています。ID 名だけではわかりません。これは、Microsoft Windows のタイム ゾーン データベースに関する厄介な問題の 1 つです。詳細については、タイムゾーン タグ wikiを参照してください。

幸いなことに、データベースはこれだけではありません。これは、最も一般的に使用されているデータベースではありません。Windows と .Net に付属するデフォルトのデータベースです。標準の IANA タイム ゾーン データベースでこの変換を行うには、Noda Timeを使用します。

DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
LocalDateTime dt = new LocalDateTime(2013, 8, 15, 10, 0, 0);
ZonedDateTime zdt = tz.AtLeniently(dt);
Instant utc = zdt.ToInstant();

また、Noda Time が誤って解釈されない型を与える方法にも注意してください。Kind行動に影響を与えるものはありません。ここでの「ローカル」とは、ローカルの値を意味するだけあり、独自のローカル クロックではありません。

を使用してタイムゾーンに日付を適用していることにも注意してAtLenientlyください。これは、あいまいまたは無効な時間が適用されたときに調整を行う戦略です。AtStrictlyこれらのシナリオで例外をスローするもあります。または、独自の戦略を作成することもできます。クラスには、TimeZoneInfoこのレベルの制御はありません。

于 2013-08-06T17:57:27.547 に答える