To dobre pytanie. Odświeżam go, aby dać trochę więcej szczegółów na temat .Net zachowuje się z różnymi Kindwartościami. Jak zauważa @Jan Zich, jest to naprawdę bardzo ważna właściwość i jest różnie ustawiany w zależności od tego, czy używasz, czy Nowteż UtcNow.
Wewnętrznie przechowywana jest data, w Ticksktórej (w przeciwieństwie do odpowiedzi @Carl Camera) różni się w zależności od tego, czy używasz Nowlub UtcNow.
DateTime.UtcNowzachowuje się jak inne języki. Ustawia Tickswartość GMT. Ustawia również Kindna Utc.
DateTime.Nowzmienia Tickswartość na taką, jaka byłaby, gdyby była to Twoja pora dnia w strefie czasowej GMT . Ustawia również Kindna Local.
Jeśli opóźnisz się o 6 godzin (GMT-6), otrzymasz czas GMT sprzed 6 godzin. .Net faktycznie ignoruje Kindi traktuje ten czas tak, jakby to było 6 godzin temu, nawet jeśli ma to być „teraz”. To się jeszcze bardziej psuje, jeśli utworzysz DateTimeinstancję, a następnie zmień strefę czasową i spróbuj z niej skorzystać.
Instancje DateTime z różnymi wartościami rodzaju nie są kompatybilne.
Spójrzmy na kod ...
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
Jak widać tutaj, porównania i funkcje matematyczne nie są automatycznie konwertowane na zgodne czasy. TimespanPowinien być prawie jedna godzina, ale zamiast tego był prawie 6. „UTC <teraz” powinno być prawdziwe (nawet dodaje godzinę, aby mieć pewność), ale nadal była fałszywa.
Możesz także zobaczyć „obejście”, które polega na zamianie na czas uniwersalny w dowolnym miejscu, które Kindnie jest takie samo.
Moja bezpośrednia odpowiedź na pytanie zgadza się z zaleceniem przyjętej odpowiedzi, kiedy należy użyć każdego z nich. Zawsze powinieneś próbować pracować z DateTimeobiektami, które mają Kind=Utc, z wyjątkiem podczas operacji we / wy (wyświetlanie i parsowanie). Oznacza to, że prawie zawsze powinieneś używać DateTime.UtcNow, z wyjątkiem przypadków, w których tworzysz obiekt tylko po to, aby go wyświetlić i odrzucić go od razu.