2012-04-20 16 views
9

¿Cómo es que el siguiente código (en C#) devuelve falso:DateTime.Ticks, DateTime.Equals y zonas horarias

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

yo esperaría que las garrapatas de un DateTime que se basan en la hora UTC. La página de MSDN en DateTime.Ticks menciona dice

El valor de esta propiedad representa el número de intervalos de 100 nanosegundos que han transcurrido desde 12:00:00 la medianoche del 1 de enero de 0001, lo que representa DateTime.MinValue. No incluye la cantidad de marcas atribuibles a segundos intercalares.

Midnight on January first, 0001 .. en qué timezone?

¿Por qué DateTime.Ticks depende de la zona horaria?

supongo que el hecho de que las garrapatas son diferentes es por eso que el siguiente código también devuelve false

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

El doc MSDN en DateTime.Equals menciones

t1 y t2 son iguales si su propiedad garrapatas los valores son iguales. Sus valores de propiedad Kind no se consideran en la prueba de igualdad.

Mi expectativa era que DateTime.Ticks fuera igual, sin importar la zona horaria.

Espero que dos momentos en el tiempo sean iguales sin importar en qué zona horaria ocurrieron. ¿Mis expectativas están equivocadas?

+1

Tenga en cuenta que puede usar DateTimeOffset (http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx) que compara el momento en el momento cuando se comparan dos instancias. –

+0

@ChrisShaffer Gracias, creo que esto es lo que debería usar, ya que lo que busco son momentos exactos en el tiempo y no "fechas" reales. – GuiSim

Respuesta

9

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

DateTime.Ticks está documentado como "número de intervalos de 100 nanosegundos que han transcurrido desde 12:00:00 medianoche, 1 de enero de 0001". Eso es 1-Jan-0001 hora local.Si convierte su DateTime a UTC, Ticks será el número de intervalos de 100 nanosegundos que hayan transcurrido desde desde las 12:00:00 de la medianoche del 1 de enero de 0001 UTC. Potencialmente diferente ese 1-Jan-0001 hora local, ergo los dos valores de Ticks serán diferentes.

0

DateTime.Now se determina según el desplazamiento de la zona horaria, lo que significa que no será igual a la hora universal a menos que el desplazamiento sea cero. No tendría sentido convertir DateTime.Now en dos zonas horarias diferentes y obtener el mismo resultado: tienen el mismo tiempo absoluto (UTC), pero no la misma hora relativa (utilizando el desplazamiento de la zona horaria).

1

Su fecha y hora actual (a menos que viva en la zona horaria específica - GMT) está desfasada de la hora UTC en x horas, por lo que DateTime.Now podría ponerlo a las 4 AM mientras que Datetime.Now.ToUniversalTime() podría estar a las 11 p.m. según tu zona horaria actual.

Las garrapatas se calculan después la conversión de la zona horaria con la hora universal, por lo que la única vez que deben ser iguales es decir, si usted vive en la zona horaria GMT.

En otras palabras, el número de tics entre el 1/1/2011 8:00 AM no es el mismo que el número de tics desde el 1/1/2011 11:00 PM. En su código, la fecha se está convirtiendo a la fecha universal y, a continuación, las marcas se calulan en el lado derecho de la ecuación, pero solo está usando su fecha local para obtener la diferencia a la izquierda, por lo tanto, están! = Cada otro.

+0

Supongo que los dos serían iguales porque representan exactamente el mismo momento en el tiempo. No esperaba que un cambio en el marco de referencia cambiara la igualdad. – GuiSim

+2

@GuiSim - Esa primera línea no debería haber estado en mi respuesta. Cuando lo volví a leer, sonaba como si estuviera siendo condescendiente. Lo siento por eso. No quise serlo Soy horrible en la comunicación escrita. – David

Cuestiones relacionadas