Pregunta

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?

¿Fue útil?

Solución

FechaHora.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 meridiano de Greenwich, básicamente como sería si estuviera en Londres, Inglaterra, pero no durante el verano. FechaHora.Ahora proporciona la fecha y la hora tal como le aparecerían a alguien en su ubicación actual.

Recomiendo usar DateTime.Now Cada vez que le muestra una fecha a un ser humano, de esa manera se siente cómodo con el valor que ve, es algo que puede comparar fácilmente con lo que ve en su reloj.Usar DateTime.UtcNow cuando desea almacenar fechas o usarlas para cálculos posteriores de esa manera (en un modelo cliente-servidor), sus cálculos no se confunden con clientes en diferentes zonas horarias de su servidor o entre sí.

Otros consejos

Es realmente bastante simple, así que creo que depende de cuál sea tu audiencia y dónde viva.

Si no usas Utc, debe Conozca 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. en el lugar donde vive.

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é parte de la Tierra viva.

Tenga en cuenta también la diferencia de rendimiento;DateTime.UtcNow es aproximadamente 30 veces más rápido que DateTime.Now, porque internamente DateTime.Now está haciendo muchos ajustes de zona horaria (puede verificar esto fácilmente con Reflector).

Por lo tanto, no utilice DateTime.Now para mediciones de tiempo relativo.

Un concepto principal que hay que entender en .NET es que ahora es ahora en todo el mundo sin importar la zona horaria en la que te encuentres.Entonces, si cargas una variable con DateTime.Now o DateTime.UtcNow -- la tarea es idéntica.* Su DateTime El objeto sabe en qué zona horaria se encuentra y lo tiene en cuenta independientemente de la asignación.

La utilidad de DateTime.UtcNow resulta útil al calcular fechas que cruzan 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 el número de horas entre el tiempo A y el tiempo B, primero debe traducir cada uno a sus equivalentes UTC antes de calcular el TimeSpan.

Esto está cubierto por un publicación de blog que escribí eso explica más 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 tuviera que cargar dos variables, una a través de DateTime.Now() y el otro vía DateTime.UtcNow() el TimeSpan La diferencia entre los dos sería de milisegundos, no de horas, suponiendo que se encuentre en una zona horaria a horas de GMT.Como se indica a continuación, imprimir sus String Los valores mostrarían diferentes cadenas.

Esta es una buena pregunta.Lo estoy reviviendo para dar un poco más de detalle sobre cómo se comporta .Net 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 usa Now o UtcNow.

Internamente la fecha se almacena como Ticks que (al contrario de la respuesta de @Carl Camera) es diferente dependiendo de si usas Now o UtcNow.

DateTime.UtcNow Se comporta como otros idiomas.Se establece Ticks a un valor basado en GMT.También establece Kind a Utc.

DateTime.Now altera el Ticks valor a ¿Qué sería si fuera tu hora del día en la zona horaria GMT?.También establece Kind a Local.

Si tiene un retraso de 6 horas (GMT-6), obtendrá la hora GMT de hace 6 horas..Net en realidad ignora Kind y trata este tiempo como si fuera hace 6 horas, aunque se supone que es "ahora".Esto se rompe aún más si creas un DateTime Por ejemplo, cambie su zona horaria e intente usarla.

Las instancias de DateTime con diferentes valores de 'Tipo' NO son compatibles.

Veamos algo de 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 funciones matemáticas no se convierten automáticamente a tiempos compatibles.El Timespan Debería haber sido casi una hora, pero en cambio fueron casi 6."utc <ahora" debería haber sido verdadero (incluso agregué una hora para estar seguro), pero aún así era falso.

También puede ver la 'solución alternativa' que consiste simplemente en convertir a hora universal en cualquier lugar que Kind no es lo mismo.

Mi respuesta directa a la pregunta concuerda con la recomendación de la respuesta aceptada sobre cuándo usar cada uno.Tu siempre deberias intentar trabajar con DateTime objetos que tienen Kind=Utc, excepto durante la E/S (visualización y análisis).Esto significa que casi siempre deberías utilizar DateTime.UtcNow, excepto en los casos en los que crea el objeto solo para mostrarlo y lo descarta de inmediato.

DateTime no tiene idea de qué zonas horarias son.Siempre asume que estás en tu hora local. UtcAhora sólo significa "Restar mi zona horaria de la hora".

Si desea utilizar fechas que tengan en cuenta la zona horaria, utilice Desplazamiento de fecha y hora, que representa una fecha/hora con una zona horaria.Tuve que aprender eso de la manera más difícil.

Sólo una pequeña adición a los puntos mencionados anteriormente:la estructura DateTime también contiene un campo poco conocido llamado Amable (al menos no lo supe desde hace mucho tiempo).Básicamente es solo una bandera que indica si la hora es local o UTC;no especifica el desplazamiento real de UTC para las horas locales.Además de indicar con qué intenciones se construyó el edificio, también influye en la forma en que se utilizaron los métodos. ATiempoUniversal() y A hora local() trabajar.

La respuesta "simple" a la pregunta es:

FechaHora.Ahora devuelve un Fecha y hora valor que representa la hora actual del sistema (en cualquier zona horaria en la que se esté ejecutando el sistema).El FechaHora.Tipo la propiedad será FechaHoraTipo.Local

FechaHora.UtcNow devuelve un Fecha y hora valor que representa la hora universal coordinada actual (también conocida como UTC), que será la misma independientemente de la zona horaria del sistema.El FechaHora.Tipo la propiedad será FechaHoraTipo.Utc

DateTime.UtcNow es una escala de tiempo continua de un solo valor, mientras que DateTime.Now no es continua ni de un solo valor.La razón principal es el horario de verano, que no se aplica a UTC.Por lo tanto, UTC nunca avanza ni retrocede una hora, mientras que la hora local (DateTime.Now) sí lo hace.Y cuando salta hacia atrás, el mismo valor de tiempo ocurre dos veces.

DateTime.UtcNow es una escala de tiempo universal que omite el horario de verano.Entonces UTC nunca cambia debido al horario de verano.

Pero DateTime.Now no es continuo ni tiene un solo valor porque cambia según el horario de verano.Lo que significa DateTime. Ahora, el mismo valor de tiempo puede ocurrir dos veces dejando a los clientes en un estado de confusión.

Cuando necesite una hora local para la máquina en la que se ejecuta su aplicación (como CEST para Europa), utilice Ahora.Si quieres una hora universal: UtcNow.Es solo una cuestión de sus preferencias: probablemente crear un sitio web local/aplicación independiente que le gustaría usar en el tiempo que tiene el usuario, tan afectado por su configuración de zona horaria: DateTime.Now.

Sólo recuerde, para un sitio web es la configuración de zona horaria del servidor.Entonces, si está mostrando la hora para el usuario, obtenga su zona horaria preferida y cambie la hora (simplemente guarde la hora Utc en la base de datos y modifíquela) o especifique que es UTC.Si olvida hacerlo, el usuario puede ver algo como: publicado hace 3 menos y luego un momento en el futuro cerca de él :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top