DateTime.Now frente a DateTime.UtcNow
Me he estado preguntando cuáles son exactamente los principios de cómo funcionan las dos propiedades. Sé que el segundo es universal y básicamente no trata con zonas horarias, pero ¿alguien puede explicar en detalle cómo funcionan y cuál debería usarse en qué escenario?
DateTime.UtcNow le indica la fecha y la hora tal como serían en el Tiempo Universal Coordinado, que también se llama zona horaria del Tiempo Medio de Greenwich, básicamente como sería si estuviera en Londres, Inglaterra, pero no durante el verano. DateTime.Now proporciona la fecha y hora tal como le aparecerían a alguien en su ubicación actual.
Recomendaría usarlo DateTime.Now
siempre que le muestres una fecha a un ser humano; de esa manera se sentirán cómodos con el valor que ven; es algo que pueden comparar fácilmente con lo que ven en su reloj. Úselo DateTime.UtcNow
cuando desee almacenar fechas o utilizarlas para cálculos posteriores de esa manera (en un modelo cliente-servidor) sus cálculos no se confundan con clientes en diferentes zonas horarias de su servidor o entre sí.
Es realmente bastante simple, así que creo que depende de cuál sea tu audiencia y dónde viva.
Si no usa Utc, debe conocer la zona horaria de la persona a la que le está mostrando fechas y horas; de lo contrario, le dirá que algo sucedió a las 3 p. m. en el horario del sistema o del servidor, cuando en realidad sucedió a las 5 p. m., donde resulta que viven.
Lo usamos DateTime.UtcNow
porque tenemos una audiencia web global y porque preferiría no molestar a cada usuario para que complete un formulario que indique en qué zona horaria vive.
También mostramos tiempos relativos (hace 2 horas, hace 1 día, etc.) hasta que la publicación envejece lo suficiente como para que la hora sea "la misma" sin importar en qué lugar de la Tierra viva.
Tenga en cuenta también la diferencia de rendimiento; DateTime.UtcNow
es alrededor de 30 veces más rápido que DateTime.Now
, porque internamente DateTime.Now
se están realizando muchos ajustes de zona horaria (puede verificar esto fácilmente con Reflector).
Por lo tanto, NO lo use DateTime.Now
para mediciones de tiempo relativo.
Un concepto principal que hay que entender en .NET es que ahora está en todo el mundo sin importar en qué zona horaria te encuentres. Entonces, si cargas una variable con o , la asignación es idéntica.* Tu objeto sabe en qué zona horaria te encuentras y lo tiene en cuenta independientemente de la tarea.DateTime.Now
DateTime.UtcNow
DateTime
La utilidad de DateTime.UtcNow
resulta útil al calcular fechas a través de los límites del horario de verano. Es decir, en lugares que participan en el horario de verano, a veces hay 25 horas desde el mediodía hasta el mediodía del día siguiente, y a veces hay 23 horas entre el mediodía y el mediodía del día siguiente. Si desea determinar correctamente la cantidad de horas de la hora A y la hora B, primero debe traducir cada una a sus equivalentes UTC antes de calcular el TimeSpan
.
Esto está cubierto en una publicación de blog que escribí que explica con más detalle TimeSpan
e incluye un enlace a un artículo de MS aún más extenso sobre el tema.
*Aclaración: Cualquiera de las asignaciones almacenará la hora actual. Si cargara dos variables, una vía DateTime.Now()
y la otra vía, DateTime.UtcNow()
la TimeSpan
diferencia entre las dos sería de milisegundos (si ambas están normalizadas vía ToUniversalTime()
), no horas, suponiendo que se encuentre en una zona horaria alejada de GMT. Como se indica a continuación, imprimir sus String
valores mostraría cadenas diferentes.