Das ist eine gute Frage. Ich belebe es wieder, um etwas detaillierter zu beschreiben, wie sich .Net mit unterschiedlichen KindWerten verhält . Wie @Jan Zich betont, handelt es sich tatsächlich um eine äußerst wichtige Eigenschaft, die je nach Verwendung Nowoder Verwendung unterschiedlich festgelegt wird UtcNow.
Intern wird das Datum so gespeichert, Ticksdass es (im Gegensatz zur Antwort von @Carl Camera) unterschiedlich ist, je nachdem, ob Sie Nowoder verwenden UtcNow.
DateTime.UtcNowverhält sich wie andere Sprachen. Es wird Ticksein GMT-basierter Wert festgelegt. Es setzt auch Kindauf Utc.
DateTime.Nowändert den TicksWert auf den Wert, der wäre, wenn es Ihre Tageszeit in der GMT-Zeitzone wäre . Es setzt auch Kindauf Local.
Wenn Sie 6 Stunden hinterher sind (GMT-6), erhalten Sie die GMT-Zeit von vor 6 Stunden. .Net ignoriert Kindund 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 DateTimeInstanz 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 Timespanhä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 Kindnicht 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 DateTimeObjekten 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.