Questa è una buona domanda Lo sto rianimando per dare un po 'più di dettagli su come .Net si comporta con Kind
valori diversi . Come sottolinea @Jan Zich, in realtà è una proprietà di fondamentale importanza ed è impostata in modo diverso a seconda che tu usi Now
o UtcNow
.
Internamente la data viene memorizzata come Ticks
(contrariamente alla risposta di @Carl Camera) è diversa a seconda se si utilizza Now
o UtcNow
.
DateTime.UtcNow
si comporta come altre lingue. Si imposta Ticks
su un valore basato su GMT. Imposta anche Kind
su Utc
.
DateTime.Now
altera il Ticks
valore di quello che sarebbe se fosse la tua ora del giorno nel fuso orario GMT . Imposta anche Kind
su Local
.
Se sei indietro di 6 ore (GMT-6), otterrai l'ora GMT da 6 ore fa. .Net in realtà ignora Kind
e tratta questa volta come se fosse 6 ore fa, anche se dovrebbe essere "adesso". Ciò si interrompe ancora di più se si crea DateTime
un'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' Timespan
avrebbe 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 Kind
non 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 DateTime
oggetti 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.