zona timezoneinfo horaria findsystemtimezonebyid example converttimefromutc cambiar c# asp.net webforms timezone

c# - timezoneinfo - Forzar una zona horaria particular en una aplicación



timezoneinfo c# example (3)

Debe almacenar sus fechas con DateTimeOffset :

Representa un punto en el tiempo, generalmente expresado como una fecha y hora del día, en relación con el Tiempo Universal Coordinado (UTC).

Usar DateTimeOffset tiene grandes ventajas, ya que estas fechas son fácilmente convertibles a cualquier zona horaria sin perder el desplazamiento donde ocurrió el evento (es decir, almacenar algunos datos en algún momento).

Como Jon Skeet sugirió en un comentario en mi respuesta, se debe almacenar un identificador de zona horaria junto con DateTimeOffset para tener la información completa de fecha y hora y hacerla completamente convertible.

Por otro lado, no puede almacenar datos en un huso horario en particular, pero con un DateTimeOffset como con el identificador de zona horaria , y luego lo convertirá al huso horario requerido según el perfil del usuario o la zona horaria de toda la aplicación. Configuración de cultura y / o en la capa de aplicación.

Finalmente, puede convertir dicho DateTimeOffset utilizando esta sobrecarga TimeZoneInfo.ConvertTime(DateTimeOffset, TimeZoneInfo) .

Una situación difícil aquí. Nuestra aplicación se ejecuta en un sistema que se configura con una TimeZone particular (digamos la hora de Asia). Sin embargo, un cliente solicita que su aplicación se ejecute utilizando la zona horaria de Europa.

Dado que nuestros datos no están almacenados en UTC, ¿hay alguna forma de que podamos establecer la configuración regional en la aplicación para que todas las fechas que se muestran utilicen Europa TimeZone? Entiendo que podemos establecer la información de Culture en Web.Config, pero no estoy seguro de si eso también puede ayudar a configurar TimeZone.

Por cierto, nuestra aplicación se está ejecutando utilizando C # WebForm y MSSQL 2008 R2.


La forma en que se almacenan sus datos está completamente separada de cómo elija mostrarla . Suponiendo que las fechas y los tiempos están destinados a representar puntos fijos en el tiempo (en lugar de flotantes "locales" veces) trataría de escribir la mayor cantidad de la aplicación posible con los valores de DateTime en UTC. Cuando recupera datos, conviértalo de su "zona horaria de almacenamiento" si lo necesita (no ha dicho en qué zona están almacenados sus datos) y conviértalo de nuevo cuando lo guarde. Cuando lo visualice , muéstrelo en la zona horaria que necesite.

No es necesario configurar esto a nivel global en lo que se refiere a .NET: puede tener una configuración de configuración para toda la aplicación (si realmente lo desea) y un código de "ayuda" para convertirla cada vez que necesite mostrarla. Sin embargo, lo haría de manera muy explícita: realmente no quieres que las conversiones sucedan implícitamente cuando se trata de cosas del tiempo.

(También mencionaría que mi biblioteca de Noda Time puede ser útil como una API más clara en lo que respecta a fechas y horas. Por supuesto, estoy predispuesto. También sugiero que migre para almacenar todo en UTC si puede. .. y solo cuando sea apropiado, por supuesto.)


¿Qué hay de cambiar la configuración regional?

CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; if (currentCulture.Name != "sv-SE") { // Change the current culture to sv-SE and serialize the date. Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("sv-SE"); } // Do something with a date in swedish timeZone var swedishNow = DateTime.Now; // Restore back to the original culture, when finished Thread.CurrentThread.CurrentCulture = currentCulture;