2013-07-15 6 views
6

Ich habe 2 DateTime Werte:Vergleich mit Datetime unspezifisch und UTC Arten

date1 < - {15-07-13 20.45.10} mit Art = Keine Angabe

date2 < - {15-07 -13 20:45:10} mit Kind = UTC

Beim Vergleich dieser 2 Daten sind die 2 Daten gleich.

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

Kann jemand erklären warum?

mir ein bisschen mehr seltsam: wenn die date1 Umwandlung in UTC (was keine Angaben Art ist), sehe ich deutlich, dass das Datum anders:

date1.ToUniversalTime() -> {15- 07-13 18.45.10} mit Art = UTC

+0

Als Behelfslösung können Sie eine benutzerdefinierte comparer, so etwas wie 'public class FullDateTimeEqualityComparer schreiben: EqualityComparer { Öffentliche Überschreibung bool Entspricht (DateTime dt1, DateTime dt2) {return dt1.Kind == dt2.Kind && dt1 == dt2; } öffentliche Überschreibung int GetHashCode (DateTime dt) {return dt.Kind.GetHashCode()^dt.GetHashCode(); }} '. –

+0

Über Ihren letzten Punkt mit der Konvertierung. Nicht spezifizierte Konvertierungen sind knifflig ... wenn Sie ToLocalTime konvertieren, wird angenommen, dass es sich um UTC handelt. Und umgekehrt, wenn Sie ToUniversalTime konvertieren, nimmt es an, dass es lokal ist. In beiden Fällen passiert also eine Konvertierung. – Cary

Antwort

10

Kann mir jemand erklären warum?

Yup. Es ist weil DateTime is a fundamentally broken type, IMO. Grundsätzlich wird die Kind nicht in Vergleichen verwendet. Dies hätte möglicherweise alten Code gebrochen, und es ist nicht immer das, was Sie wollen. Es wurde für .NET 1.1 hinzugefügt, und nicht immer auf eine gute Art und Weise - es war definitiv nicht vollständig in jeder Weise integriert, die Sie erwartet haben, wie Sie für Vergleiche gesehen haben.

Als weiteres Beispiel auch für eine Kind von Local (was gemeint ist, das System die lokale Zeitzone zu sein) es für die Arithmetik ignoriert wird, was bedeutet, ein Anruf von AddHours(1) wirklich nur auf die lokale Zeit hinzufügt, anstatt es darstellt verstrichen Zeit (die am Ende die gleiche Ortszeit oder zwei Stunden später in Ortszeit sein könnte, um DST-Übergänge).

Mein Rat ist nur zu vermeiden, DateTime Werte von verschiedenen Arten in erster Linie zu vergleichen. Es ist fast nie das, was du machen willst.

(. Natürlich würde ich auch Noda Time empfehlen verwenden, aber das ist eine etwas andere Sache)

+0

'DateTimeOffset' funktioniert auch besser (für diesen speziellen Zweck) –

+0

@MattJohnson: Potentiell. Obwohl "DateTimeOffset" für eine "Art" von "Nicht spezifiziert" wirklich seltsam ist ... –

+0

Oh ja, du hast Recht. Sehen Sie, es ist so FUBAR, auch wenn ich manchmal falsch liege ... :) –

8

aus der Dokumentation auf DateTimeKind (Schwerpunkt ist von mir):

die Mitglieder der Datetimekind Aufzählung verwendet werden, bei der Umwandlung Operationen zwischen der Ortszeit und Abgestimmte Weltzeit (UTC), aber nicht im Vergleich oder arithmetische Operationen.

+0

Das ist auch eine sehr gute Antwort. Vielen Dank! –