2009-02-23 18 views
79

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

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

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

Respuesta

112

DateTime en sí mismo no contiene información de zona horaria real. Es 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 zonas horarias desde .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. Sin embargo, soy parcial, ya que el autor principal de Noda Time :)

+2

El PublicDomain projhect en CodePlex hace esto por usted. – Cheeso

+0

Una TimeZone enum en el BCL sería agradable si las zonas horarias mundiales son estáticas y no cambian. – jlafay

+1

@jlafay: Sin embargo, sí cambian: se agregaron más zonas horarias a Windows el año pasado, por ejemplo. –

29

No.

Un desarrollador es responsable de mantener un registro de la información de zona horaria asociada con un valor 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.

2

usted podría utilizar TimeZoneInfo clase

La clase de zona horaria reconoce la zona horaria local, y puede convertir veces entre el Tiempo Universal Coordinado (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 soportan las siguientes operaciones:

  1. Recuperación de una zona de tiempo que ya está definido por el sistema operativo .

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

  3. Tiempos de conversión entre diferentes zonas horarias.

  4. Creación de una nueva zona horaria que no está definida por el sistema operativo .

    Serialización de una zona horaria para su recuperación posterior.

+1

... pero, dado un DateTime, todavía no hay una manera de usar TimeZoneInfo para determinar el TimeZone de DateTime, que yo sepa. –

+1

si Jon Skeet tiene razón al respecto – Shekhar

Cuestiones relacionadas