2013-07-15 24 views
6

I 2つのDateTime値を有する:比較日付時刻

DATE1 < - 種類に{15-07-13夜08時45分10秒を} =未指定

DATE2 < - {15から07 -13 20:45:10} Kind = UTC

これらの2つの日付を比較すると、2つの日付は同じです。

if (DateTime.Compare(date1, date2)!=0) 
    ... 

誰かが説明できる理由はありますか?

少し奇妙な私には:UTCに(指定されていないようなものです)日付1を変換するとき、私ははっきりと日付が異なることを参照してください。

date1.ToUniversalTime() - > {15- 7月13日18時45分10秒} DateTimeKindのドキュメント(強調は私です)からの親切= UTC

+0

回避策は、カスタム比較子を書きたいかもしれませんが、 'パブリッククラスFullDateTimeEqualityComparerのようなものを:EqualityComparer { public override bool等しい(DateTime dt1、DateTime dt2){return dt1.Kind == dt2.Kind && dt1 == dt2; } public override int GetHashCode(DateTime dt){return dt.Kind.GetHashCode()^ dt.GetHashCode(); }} '。 –

+0

変換の最終ポイントについて未指定の変換は厄介です... ToLocalTimeを変換する場合、変換はUTCであるとみなされます。逆に、ToUniversalTimeを変換する場合、それはローカルであるとみなされます。だからどちらの方法でも変換が行われます。 – Cary

答えて

10

誰かが私の理由を説明できますか?

これは、DateTime is a fundamentally broken type、IMOです。基本的にKindは比較に使用されません。そうすることで、古いコードが壊れている可能性があります。これは必ずしもあなたが望むものではありません。これは.NET 1.1用に追加されたものであり、常に優れた方法ではありません。比較のために見てきたように、予想どおりのあらゆる方法で完全に統合されているわけではありません。別の例として

は、偶数(システムのローカルタイムゾーンであることを意味する)LocalKindためにそれだけではなく、それが表すよりも、ローカル時刻に追加実際AddHours(1)のコールを意味し、演算では無視されます経過時間(これは、同じローカルタイムになる可能性があります。または、ローカルタイムで2時間後に、DSTトランジションの周りになる可能性があります)。

私の助言は、最初に異なる種類の値をDateTimeと比較しないようにすることです。あなたがしたいことはほとんど決してありません。

(もちろん私もNoda Timeを使用してお勧めしますが、それはわずかに異なる問題です。)

+0

'DateTimeOffset'もここではうまくいくでしょう(この特定の目的のために) –

+0

@MattJohnson:潜在的に。 「Unspecified」の 'Kind'については、' DateTimeOffset'は本当に変です... –

+0

ああ、そうです。それでは、時には間違っていてもそれほどFUBARなのです... :) –

8

で:

DateTimeKind列挙のメンバーを変換 操作に使用されるローカル時間の間協定世界時(UTC) ですが、比較または算術演算ではありません

+0

これはまた非常に良い答えです。ありがとう! –