zona horaria cambiar c# .net datetime timezone

cambiar zona horaria c#



Obtener zona horaria desde DateTime (6)

¿.Net DateTime contiene información sobre la zona horaria donde se creó?

Tengo una biblioteca que analiza DateTime desde un formato que tiene "+ zz" al final, y mientras analiza correctamente y ajusta una hora local, necesito obtener la zona horaria específica del objeto DateTime.

¿Es esto posible? Todo lo que puedo ver es DateTime.Kind, que especifica si el tiempo es local o UTC.


DateTime en sí no contiene información de zona horaria real. Puede saber si es UTC o local, pero no lo que realmente significa local.

DateTimeOffset es algo mejor, eso es básicamente una hora UTC y un desplazamiento. Sin embargo, eso aún no es suficiente para determinar la zona horaria, ya que muchas zonas horarias diferentes pueden tener la misma compensación en cualquier punto en el tiempo. Sin embargo, esto parece ser lo suficientemente bueno para usted, ya que todo lo que tiene que trabajar al analizar la fecha / hora es el desplazamiento.

El soporte para las zonas horarias a partir de .NET 3.5 es mucho mejor de lo que era, pero realmente me gustaría ver un "ZonedDateTime" estándar o algo así, una hora UTC y una zona horaria real. Es fácil crear uno propio, pero sería bueno verlo en las bibliotecas estándar.

EDITAR: Casi cuatro años después, ahora sugiero usar Noda Time, que tiene un conjunto bastante más rico de tipos de fecha / hora. Aunque soy parcial, como el autor principal de Noda Time :)



En general, la práctica sería pasar datos como un DateTime con una "zona horaria" de UTC y luego pasar un objeto TimeZoneInfo y cuando esté listo para mostrar los datos, utilice el objeto TimeZoneInfo para convertir el UTC DateTime.

La otra opción es establecer DateTime con la zona horaria actual, y luego asegúrese de que la "zona horaria" sea desconocida para el objeto DateTime, luego asegúrese de que DateTime se pasa nuevamente con TimeZoneInfo que indica la zona horaria del DateTime pasado.

Como otros han indicado aquí, sería bueno si Microsoft se pusiera al tanto de esto y creara un buen objeto para hacerlo todo, pero por ahora tiene que lidiar con dos objetos.



No.

Un desarrollador es responsable de mantener un registro de la información de la zona horaria asociada con un valor de DateTime a través de algún mecanismo externo.

Una cita de un excelente artículo here . Una lectura obligada para cada desarrollador de .Net.

Así que mi consejo es escribir una pequeña clase de contenedor que se adapte a sus necesidades.


Podría usar la clase TimeZoneInfo

La clase TimeZone reconoce la zona horaria local y puede convertir los tiempos entre la hora universal coordinada (UTC) y la hora local. Un objeto TimeZoneInfo puede representar cualquier zona horaria, y los métodos de la clase TimeZoneInfo se pueden usar para convertir la hora en una zona horaria a la hora correspondiente en cualquier otra zona horaria. Los miembros de la clase TimeZoneInfo admiten las siguientes operaciones:

  1. Recuperar una zona horaria que ya está definida por el sistema operativo.

  2. Enumeración de las zonas horarias que están disponibles en un sistema.

  3. Convertir tiempos entre diferentes zonas horarias.

  4. Crear una nueva zona horaria que no esté definida por el sistema operativo.

    Serializar una zona horaria para su posterior recuperación.