timezoneinfo findsystemtimezonebyid convert change asp.net time timezone

asp.net - findsystemtimezonebyid - timezone c#



¿Hay alguna manera de definir la zona horaria de una aplicación en ASP.NET? (3)

¿Hay alguna forma de definir la zona horaria de una aplicación en ASP.NET de modo que todas las lecturas desde / comparadas con la hora actual del servidor se conviertan implícitamente, o tengo que poner las declaraciones de conversión como todas y cada una de las llamadas de DateTime.Now?



No estoy seguro de las últimas evoluciones de ASP, pero este artículo de 2006 ofrece una respuesta interesante:

El problema es que la información de la zona horaria no está disponible directamente a través del navegador web. Puede usar la heurística para determinar la zona horaria correcta o tendrá que almacenar la configuración de la zona horaria para un usuario en función de su selección.

Lo que sigue puede no ser necesario con .Net 3.5 y su método TimeZoneInfo..ConvertTime , pero aún así, para mayor completud:

Una vez que tenga la configuración de la zona horaria, ahora necesita traducir los tiempos. Siempre debe almacenar sus valores de fecha / hora en el DB en UTC . Esto elimina muchos problemas de conversión. Si almacena la información en UTC, solo necesita traducir de UTC a la zona horaria local del usuario cuando visualiza los datos y necesita convertir de su zona horaria a UTC cuando obtiene los valores de fecha / hora de ellos.

Lo que hace esto más difícil es el hecho de que la clase TimeZone no es tan útil. Afortunadamente en v2.0 DateTime se actualizó para admitir un indicador sobre si la hora está en UTC o no. Puede convertir un DateTime a UTC utilizando el método DateTime.ToUniversalTime. Lamentablemente, sin embargo, no puede convertirlo de nuevo .

El método ToLocalTime utiliza la zona horaria local que, cuando se ejecuta en el servidor, utiliza la zona horaria del servidor que no es la que usted quería. Lo que es peor, sin embargo, es que no puedes simplemente crear un objeto TimeZone y usarlo ya que ese soporte no existe.

Michael Brumm creó una pequeña clase para poder crear y usar zonas horarias fácilmente. Yo personalmente uso una versión muy modificada de ese código en mis propias aplicaciones y funciona muy bien. Estos son los pasos para convertir un valor DB UTC a la zona horaria del usuario local.

1) Obtenga el valor de la zona horaria almacenada para el usuario
2) Cree una clase SimpleTimeZone para envolverlo (usando algún esquema de mapeo que asigne un valor de base de datos a la versión de registro subyacente de Windows)
3) Use el método SimpleTimeZone.ToLocalTime para convertir el valor de DateTime a la hora local.

Por motivos de rendimiento, probablemente debería obtener e inicializar la instancia de SimpleTimeZone y almacenarla en la propiedad Items para la longitud de la solicitud, para que no tenga que seguir creando.

Para convertir desde la zona horaria local del usuario a UTC, haga lo contrario:

1) Obtenga el valor de la zona horaria almacenada del usuario
2) Crea una clase SimpleTimeZone para envolverlo
3) Use el método SimpleTimeZone.ToUniversalTime para convertir DateTime a UTC.


Permíteme responder esta pregunta directamente .

¿Hay alguna forma de definir la zona horaria de una aplicación en ASP.NET de modo que todas las lecturas desde / en comparación con la hora actual del servidor se conviertan implícitamente ...

No, esto no es posible No hay ningún mecanismo en .NET para cambiar la zona horaria local por subproceso o por aplicación. Solo se puede cambiar en todo el sistema según la configuración de zona horaria de la máquina en la que se está ejecutando el código. Ver esta respuesta también

... o tengo que poner declaraciones de conversión como todas y cada una de las llamadas de DateTime.Now?

No debería utilizar DateTime.Now en una aplicación web. Debido a que la configuración de zona horaria de su servidor puede cambiarse fácilmente, debe diseñar su aplicación para ignorarla. Eso significa usar DateTime.UtcNow cuando lee la hora actual del sistema. Alternativamente, puede usar DateTimeOffset con sus propiedades DateTimeOffset.Now o DateTimeOffset.UtcNow .

Ver también: El caso contra DateTime.Now

Cuando necesite trabajar con la hora local del usuario en particular, entonces sí, debe incluir conversiones para cada uso. Puede usar la clase TimeZoneInfo para lograr esto.

También podría considerar usar Noda Time , que ofrece una implementación de la base de datos de la zona horaria de la IANA , y es una API mucho mejor en general.