Questa è una buona domanda Lo sto rianimando per dare un po 'più di dettagli su come .Net si comporta con Kindvalori diversi . Come sottolinea @Jan Zich, in realtà è una proprietà di fondamentale importanza ed è impostata in modo diverso a seconda che tu usi Nowo UtcNow.
Internamente la data viene memorizzata come Ticks(contrariamente alla risposta di @Carl Camera) è diversa a seconda se si utilizza Nowo UtcNow.
DateTime.UtcNowsi comporta come altre lingue. Si imposta Tickssu un valore basato su GMT. Imposta anche Kindsu Utc.
DateTime.Nowaltera il Ticksvalore di quello che sarebbe se fosse la tua ora del giorno nel fuso orario GMT . Imposta anche Kindsu Local.
Se sei indietro di 6 ore (GMT-6), otterrai l'ora GMT da 6 ore fa. .Net in realtà ignora Kinde tratta questa volta come se fosse 6 ore fa, anche se dovrebbe essere "adesso". Ciò si interrompe ancora di più se si crea DateTimeun'istanza, quindi si modifica il fuso orario e si tenta di utilizzarlo.
Le istanze di DateTime con valori 'Kind' diversi NON sono compatibili.
Diamo un'occhiata ad un po 'di codice ...
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
Come puoi vedere qui, i confronti e le funzioni matematiche non si convertono automaticamente in tempi compatibili. L' Timespanavrebbe dovuto essere quasi un'ora, ma invece era quasi 6. "utc <ora" avrebbe dovuto essere vero (Ho anche aggiunto un ora per essere sicuri), ma era ancora falsa.
Puoi anche vedere il "aggirare" che è semplicemente convertire in tempo universale ovunque Kindnon sia lo stesso.
La mia risposta diretta alla domanda concorda con la raccomandazione della risposta accettata su quando utilizzarla. Dovresti sempre provare a lavorare con DateTimeoggetti che hanno Kind=Utc, tranne durante l'I / O (visualizzazione e analisi). Ciò significa che dovresti quasi sempre utilizzarlo DateTime.UtcNow, ad eccezione dei casi in cui stai creando l'oggetto solo per visualizzarlo e scartarlo immediatamente.