2012-04-20 14 views
9

come mai il seguente codice (in C#) restituisce false:DateTime.Ticks, DateTime.Equals e fusi orari

DateTime d = DateTime.Now; 
d.Ticks == d.ToUniversalTime().Ticks; // false 

mi aspetto le zecche di un DateTime per essere basati sul tempo UTC. La pagina di MSDN su DateTime.Ticks menziona dice

Il valore di questa proprietà rappresenta il numero di intervalli di 100 nanosecondi trascorsi dal 12:00:00 mezzanotte del 1 gennaio 0001, che rappresenta DateTime.MinValue. Non include il numero di zecche attribuibili ai secondi bisestili.

Mezzanotte di gennaio primo, 0001 .. in quale fuso orario?

Perché DateTime.Ticks può essere dipendente dal fuso orario?

credo che il fatto che le zecche sono diverso è il motivo per cui il seguente codice restituisce anche falsa

DateTime d = DateTime.Now; 
d == d.ToUniversalTime(); // false 

Il documento MSDN su DateTime.Equals menzioni

t1 e t2 sono uguali se la loro proprietà Ticks i valori sono uguali I loro valori di proprietà Kind non sono considerati nel test per l'uguaglianza.

La mia aspettativa era che DateTime.Ticks sarebbe stato uguale, indipendentemente dal fuso orario.

Mi aspetto che due momenti siano uguali, indipendentemente dal fuso orario in cui si sono verificati. Le mie aspettative sono sbagliate?

+1

Nota che è possibile utilizzare DateTimeOffset (http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx) che confronta il momento nel confronto di due istanze. –

+0

@ChrisShaffer Grazie, penso che questo è quello che dovrei usare dato che quello che sto cercando sono i momenti esatti nel tempo e non le "date" reali. – GuiSim

risposta

9

fonte: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

DateTime.Ticks è documentato come "numero di intervalli di 100 nanosecondi che sono trascorsi da 12:00:00 a mezzanotte, il 1 ° gennaio 0001". Questo è 1-Jan-0001 ora locale.Se convertite DateTime in UTC, le zecche saranno quindi il numero di intervalli di 100 nanosecondi che sono scaduti dalle 12:00:00 di mezzanotte, 1 gennaio 0001 UTC. Potenzialmente diverso che 1-gen-0001 ora locale, quindi i due valori di zecche saranno diversi.

0

DateTime.Now viene determinato in base all'offset del fuso orario, il che significa che non sarà uguale al tempo universale a meno che l'offset non sia zero. Non avrebbe senso convertire lo DateTime.Now in zecche in due diversi fusi orari e ottenere lo stesso risultato - sono lo stesso tempo assoluto (UTC), ma non lo stesso tempo relativo (utilizzando l'offset del fuso orario).

1

L'ora corrente (a meno che non si viva in un fuso orario specifico - GMT) viene compensata dall'ora UTC di x ore, quindi DateTime.Now potrebbe metterti alle 4 AM mentre Datetime.Now.ToUniversalTime() potrebbe essere alle 23:00 in base al fuso orario corrente.

Le zecche sono calcolati dopo la conversione dal fuso orario al tempo universale, per cui l'unica volta che dovrebbero essere uguali è che se si vive nel fuso orario GMT.

Più semplicemente, il numero di zecche tra l'1/1/2011 8:00 AM non è lo stesso del numero di zecche dal 1/1/2011 alle 23:00. Nel tuo codice, la data viene convertita nella data universale, quindi i segni di spunta vengono calulati sul lato destro dell'equazione, ma è solo usando la tua data locale per ottenere la differenza a sinistra, quindi, sono! = Ciascuno altro.

+0

Suppongo che i due sarebbero uguali perché rappresentano lo stesso identico momento nel tempo. Non mi aspettavo che un cambiamento nel quadro di riferimento avrebbe cambiato l'uguaglianza. – GuiSim

+2

@GuiSim - Quella prima riga non avrebbe dovuto essere nella mia risposta. Quando l'ho riletto, mi sembrava di essere condiscendente. Mi dispiace per quello Non volevo essere. Sono solo orribile nella comunicazione scritta. – David