Esta es una buena pregunta. Lo estoy reviviendo para dar un poco más de detalle sobre cómo .Net se comporta con diferentes Kind
valores. Como señala @ Jan Zich, en realidad es una propiedad de importancia crítica y se establece de manera diferente dependiendo de si se usa Now
o no UtcNow
.
Internamente, la fecha se almacena como Ticks
que (al contrario de la respuesta de @Carl Camera) es diferente dependiendo de si usa Now
o UtcNow
.
DateTime.UtcNow
se comporta como otros idiomas. Se establece Ticks
en un valor basado en GMT. También se establece Kind
en Utc
.
DateTime.Now
altera el Ticks
valor de lo que sería si fuera su hora del día en la zona horaria GMT . También se establece Kind
en Local
.
Si tiene 6 horas de retraso (GMT-6), obtendrá el tiempo GMT de hace 6 horas. .Net en realidad ignora Kind
y trata esta vez como si fuera hace 6 horas, a pesar de que se supone que es "ahora". Esto se rompe aún más si crea una DateTime
instancia, luego cambia su zona horaria e intenta usarla.
Las instancias de DateTime con diferentes valores 'Kind' NO son compatibles.
Veamos un código ...
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
Como puede ver aquí, las comparaciones y las funciones matemáticas no se convierten automáticamente a tiempos compatibles. El Timespan
debería haber sido casi una hora, pero en cambio era casi 6. "utc <ahora" debería haber sido cierto (incluso agregué una hora para estar seguro), pero aún así era falso.
También puede ver el 'trabajo' que consiste simplemente en convertir al tiempo universal en cualquier lugar que Kind
no sea el mismo.
Mi respuesta directa a la pregunta está de acuerdo con la recomendación de la respuesta aceptada sobre cuándo usar cada una. Siempre debe intentar trabajar con DateTime
objetos que lo tengan Kind=Utc
, excepto durante la E / S (visualización y análisis). Esto significa que casi siempre debería usarlo DateTime.UtcNow
, excepto en los casos en que está creando el objeto solo para mostrarlo y descartarlo de inmediato.