DateTime差演算子は夏時間を考慮しますか?
-
03-07-2019 - |
質問
私が知る限り、 DateTime
型の差演算子はうるう年を考慮します:
new DateTime(2008, 3, 1) - new DateTime(2008, 2, 1) // should return 29 days
new DateTime(2009, 3, 1) - new DateTime(2009, 2, 1) // should return 28 days
しかし、夏時間はどうですか?
解決
そうなるとは思わない。 ドキュメントは、DateTimeが保存されていることを示しています。 0001年1月1日の深夜12:00:00からのティック数として、しかし実際には真夜中がどのTimeZoneであるかは述べていません-常に内部的にUTCに保存されている場合、彼らは言うでしょうそう。
ただし、これを簡単に回避できます。
var difference = Dt1.ToUniversalTime() - Dt2. ToUniversalTime()
UTCへの変換では夏時間を考慮します
他のヒント
.NETは、希望する答えを提供しても、夏時間を正しく処理しません。間違った答えをしたい。
ショートバージョン:
-
.NETは、1977年にエネルギー危機により、夏時間が夏全体に実施されたことをどのようにして知ることができますか?
-
クネセットによって毎年規則が決定されるとき、.NETはイスラエルで夏時間規則がどうなるかをどのように知ることができますか?
-
.NETは、第二次世界大戦中に米国がDSTを1年中実行したことをどのように認識しますか。
.NETは警戒を試み、現在の夏時間規則が有効でなかった、または有効であっても、それを使用します。結果は、あなたが望むと思うが間違っている答えを得るということです。
Raymond Chen のブログエントリ、サマータイムが直感的でない理由:
(win32)タイムゾーン変換関数が、その時期に適したタイムゾーンを使用しないのはなぜですか?
...
Win32はどちらを推測しようとしません タイムゾーン規則はその時点で有効でした こんど。 Win32は次のように述べています。" 木曜日、 2002年10月17日8:45:38 AM PST "。
注:太平洋標準時間。でも 10月17日は太平洋でしたが 夏時間時間、Win32は時間を表示します 標準時間として 今です。
.NETによると、" まあ、もしルールが 効果は現在も有効でした 2003年10月17日、それは 夏時間"それが表示されます " 2003年10月17日木曜日、午前9時45分 PDT" -夏時間。
だからあなたが得る答えは間違っています。しかし、あなたは間違った答えを期待しているので、それはあなたが得るものです。
夏時間は、一般的な12のタイムゾーンと、それらを使用している国よりも具体的です。
異なる国または国のグループは、DSTが発生する日付に異なる日付を使用します。
それをしていない国、または国の一部は言うまでもなく、実際には少し苦痛です。
たとえば、クイーンズランド州では、オーストラリアの他の地域とは異なり、オーストラリアのDSTがDSTを持っています。
そうしなくても驚くことはありませんが、そうしなければ、少なくともcultureinfoなしでそれを行うことはできません。
UTCを使用してDateTimeを構築することを強制したり、DSTが有効であったかどうかを指定したりすることはできないという事実に基づいて、実際にはできませんローカル時間値を使用してDateTimeを構築するとき。さらに、モード(LTまたはUTC)を「未指定」にすることができます。これは単純です。
Local Time値からDateTime値の構築を許可することにより、曖昧なDateTime値(Local Timeとして指定)を構築できます(たとえば、米国の11月2日の午前1時から午前2時まで、時間は繰り返されます)、確定的にUTCに戻すことはできません。コンストラクターが指定された現地時間にDSTが有効であるかどうかを指定するパラメーターを提供していない限り。
このようなパラメーターは提供されないため、DateTimeクラスの設計は不完全であり、現地時間を正しく指定するために必要なすべてのパラメーターを考慮することができませんでした。
だからこそ、彼らはDateTimeOffsetクラスを作成したのだと思います。もしあなたがそのような一見冗長なクラスが存在する理由を混乱させたなら...それが理由です。
その結果、DateTimeMode.Utcに設定されていないDateTimeインスタンスでは、いかなる種類の計算も実行しないでください。 UTCのみを使用します。 LTとの間で変換することはできません。これは、2つの異なるバグによって、両方の方法で破壊されているためです。 1. LTからUTCへの移行は、前述のように、DSTがLTのその1つのあいまいな時間に有効であったかどうかを指定できないため、無効になります。ああ、それはまた、基本的に不可能な現地時間を指定することを可能にします。例えば、時計が先に進められたときにスキップする時間などです。 2.過去のUTC値を現地時間に変換する場合、Windowsは、指定された時間ではなく、現在が有効であるかどうかに基づいてDSTを相殺することにより、それを台無しにします。もちろん、ファイル名を書き留めたり、保存したり、使用したりした変更時刻が、WindowsエクスプローラーでHOUR OFFを表示すると、この問題に気づいたかもしれません。いいえ、クレイジーではありません。Windowsには深刻なバグがあります。DOSのリリースと最新の.NETフレームワーク(〜20年)の間のどこかに修正する時間はありませんでした!もちろん、そのバグはCVSシステムや変更時間を追跡するあらゆるものに影響します。 FATファイルシステムは時刻をローカル時刻として保存します。つまり、完全にねじ込まれています。
テストして確認してください!
test年の場合と同じように、DSTの場合と同じように簡単にテストを記述できます。