Das ist eine gute Frage. Ich belebe es wieder, um etwas detaillierter zu beschreiben, wie sich .Net mit unterschiedlichen Kind
Werten verhält . Wie @Jan Zich betont, handelt es sich tatsächlich um eine äußerst wichtige Eigenschaft, die je nach Verwendung Now
oder Verwendung unterschiedlich festgelegt wird UtcNow
.
Intern wird das Datum so gespeichert, Ticks
dass es (im Gegensatz zur Antwort von @Carl Camera) unterschiedlich ist, je nachdem, ob Sie Now
oder verwenden UtcNow
.
DateTime.UtcNow
verhält sich wie andere Sprachen. Es wird Ticks
ein GMT-basierter Wert festgelegt. Es setzt auch Kind
auf Utc
.
DateTime.Now
ändert den Ticks
Wert auf den Wert, der wäre, wenn es Ihre Tageszeit in der GMT-Zeitzone wäre . Es setzt auch Kind
auf Local
.
Wenn Sie 6 Stunden hinterher sind (GMT-6), erhalten Sie die GMT-Zeit von vor 6 Stunden. .Net ignoriert Kind
und behandelt diese Zeit tatsächlich so, als wäre es 6 Stunden her, obwohl es "jetzt" sein soll. Dies bricht noch mehr ab, wenn Sie eine DateTime
Instanz erstellen, dann Ihre Zeitzone ändern und versuchen, sie zu verwenden.
DateTime-Instanzen mit unterschiedlichen 'Kind'-Werten sind NICHT kompatibel.
Schauen wir uns einen Code an ...
DateTime utc = DateTime.UtcNow;
DateTime now = DateTime.Now;
Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc
Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local
Debug.Log (utc.Ticks); // 635677391678617830
Debug.Log (now.Ticks); // 635677139678617840
now = now.AddHours(1);
TimeSpan diff = utc - now;
Debug.Log (diff); // 05:59:59.9999990
Debug.Log (utc < now); // false
Debug.Log (utc == now); // false
Debug.Log (utc > now); // true
Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true
Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010
Wie Sie hier sehen können, werden Vergleiche und mathematische Funktionen nicht automatisch in kompatible Zeiten konvertiert. Das Timespan
hätte fast eine Stunde sein sollen, aber stattdessen war es fast 6. "utc <now" hätte wahr sein sollen (ich habe sogar eine Stunde hinzugefügt, um sicher zu sein), war aber immer noch falsch.
Sie können auch die "Umgehung" sehen, die darin besteht, einfach überall in die Weltzeit umzuwandeln, wo dies Kind
nicht dasselbe ist.
Meine direkte Antwort auf die Frage stimmt mit der Empfehlung der akzeptierten Antwort überein, wann sie jeweils verwendet werden soll. Sie sollten immer versuchen , mit DateTime
Objekten zu arbeiten Kind=Utc
, außer während der E / A (Anzeigen und Parsen). Dies bedeutet, dass Sie fast immer verwenden sollten DateTime.UtcNow
, außer in den Fällen, in denen Sie das Objekt nur erstellen, um es anzuzeigen, und es sofort verwerfen.