To dobre pytanie. Odświeżam go, aby dać trochę więcej szczegółów na temat .Net zachowuje się z różnymi Kind
wartoś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 Now
też UtcNow
.
Wewnętrznie przechowywana jest data, w Ticks
której (w przeciwieństwie do odpowiedzi @Carl Camera) różni się w zależności od tego, czy używasz Now
lub UtcNow
.
DateTime.UtcNow
zachowuje się jak inne języki. Ustawia Ticks
wartość GMT. Ustawia również Kind
na Utc
.
DateTime.Now
zmienia Ticks
wartość na taką, jaka byłaby, gdyby była to Twoja pora dnia w strefie czasowej GMT . Ustawia również Kind
na Local
.
Jeśli opóźnisz się o 6 godzin (GMT-6), otrzymasz czas GMT sprzed 6 godzin. .Net faktycznie ignoruje Kind
i 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 DateTime
instancję, 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. Timespan
Powinien 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 Kind
nie 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 DateTime
obiektami, 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.