データベース/モデルにDateTimeOffsetsがあります。これらの値をWebで表示するために、DateTimeOffsetsを現在のユーザーのタイムゾーンに変換します。
MSDNによると、DateTimeOffsetは特定のTimeZoneではあいまいになる可能性があります。
TimeZoneInfo.IsAmbiguousTimeメソッド(DateTimeOffset)
これは私にはまったく意味がありません。あいまいなDateTimeOffsetの例を教えてもらえますか?
TimeZone「W.EuropeStandardTime」にいます。
ここで「曖昧」を定義する方法が混乱の原因だと思います。
明確にするために、aDateTimeOffset
はそれ自体にあいまいになることはありません。それは常に絶対的な瞬間の特定の瞬間を表しています。日付、時刻、およびオフセットが与えられると、ローカルの実時間と正確なUTC時刻(オフセットを適用することにより)の両方を知ることができます。
ただし、値のウォールタイム部分は、特定のタイムゾーン内であいまいになる可能性があります。つまり、オフセットを無視した場合の日付と時刻のみです。それTimeZoneInfo.IsAmbiguousTime
があなたに言っていることです。ことは、それはオフセットがなければ、値はあいまいになります。ウォールタイムは、そのタイムゾーンの人が混乱する可能性がある時間です。
このメソッドには2つのオーバーロードがあることを考慮してください。1つはaを取り、DateTime
もう1つはDateTimeOffset
。を取ります。
DateTime
とき1は完璧な理にかなって.Kind
いますDateTimeKind.Unspecified
。
DateTime dt = new DateTime(2016, 10, 30, 2, 0, 0);
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
bool ambiguous = tz.IsAmbiguousTime(dt); // true
最初に指定されたタイムゾーンへの変換を行うため、他の種類では少し意味がありませんが、それでも同じことを行います。
DateTime dt = new DateTime(2016, 10, 30, 1, 0, 0, DateTimeKind.Utc);
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
bool ambiguous = tz.IsAmbiguousTime(dt); // true
DateTimeOffset
過負荷は、基本的に前の例と同じことをやっています。オフセットが何であれ、それは日付と時刻に適用され、最初の例のように、結果の日付と時刻だけであいまいさがチェックされます。
DateTimeOffset dto = new DateTimeOffset(2016, 10, 30, 2, 0, 0, TimeSpan.FromHours(1));
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
bool ambiguous = tz.IsAmbiguousTime(dto); // true
そのタイムゾーンには意味のないオフセットがあっても、比較する前に適用されます。
DateTimeOffset dto = new DateTimeOffset(2016, 10, 29, 19, 0, 0, TimeSpan.FromHours(-5));
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
bool ambiguous = tz.IsAmbiguousTime(dto); // true
つまり、オーバーロードの実装に要約されます。これは基本的に次のとおりです。
// Make sure the dto is adjusted to the tz. This could be a no-op if it already is.
DateTimeOffset adjusted = TimeZoneInfo.ConvertTime(dto, tz);
// Then just get the wall time, stripping away the offset.
// The resulting datetime has unspecified kind.
DateTime dt = adjusted.DateTime;
// Finally, call the datetime version of the function
bool ambiguous = tz.IsAmbiguousTime(dt);
これは、こちらの.netリファレンスソースで確認できます。彼らはそれを2行に要約し、DSTが適用できない場合にパフォーマンスを向上させるためのショートカットを前に付けますが、それはそれが行うことです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加