Información general sobre zonas horarias

La clase TimeZoneInfo simplifica la creación de aplicaciones que tengan en cuenta la zona horaria. La clase TimeZone admite el trabajo con la zona horaria local y la hora universal coordinada (UTC). La clase TimeZoneInfo admite ambas zonas, así como cualquier zona horaria sobre qué información está predefinida en el registro. También puede usar TimeZoneInfo para definir las zonas horarias personalizadas sobre las que el sistema no tiene información.

Fundamentos de la zona horaria

Una zona horaria es una región geográfica en la que se usa la misma hora. Normalmente, pero no siempre, las zonas horarias adyacentes tienen una hora de diferencia. La hora de cualquier zona horaria del mundo se puede expresar como un desplazamiento a partir de la hora universal coordinada (UTC).

Muchas zonas horarias del mundo admiten el horario de verano. El horario de verano intenta maximizar las horas de luz diarias al adelantar la hora una hora en primavera o a principios de verano y regresar a la hora normal (o estándar) a finales de verano o en otoño. Estos cambios en relación con el horario estándar se conocen como reglas de ajuste.

El cambio al horario de verano o desde este en una zona horaria determinada puede definirse con una regla de ajuste fija o con una regla de ajuste flotante. Una regla de ajuste fija establece una fecha concreta en la que se produce la transición hacia o desde el horario de verano cada año. Por ejemplo, una transición desde el horario de verano hacia el horario estándar que se produce cada año el 25 de octubre sigue una regla de ajuste fija. Mucho más comunes son las reglas de ajuste flotantes, que establecen un día concreto de una semana concreta de un mes determinado para la transición hacia o desde el horario de verano. Por ejemplo, una transición desde el horario estándar hacia el horario de verano que se produce el tercer domingo de marzo sigue una regla de ajuste flotante.

Para las zonas horarias que admiten reglas de ajuste, el cambio de horario de verano crea dos tipos de horas anómalas: horas no válidas y horas ambiguas. Una hora no válida es una hora no existente creada por la transición desde el horario estándar hacia el horario de verano. Por ejemplo, si esta transición se produce en un día determinado a las 2:00 a. m. y hace que la hora cambie a 3:00 a. m., cada intervalo de tiempo entre las 2:00 a. m. y las 2:59:59 a. m. no es válida. Una hora ambigua es aquella que se puede asignar a dos horas diferentes en una sola zona horaria. Se crea durante la transición del horario de verano hacia el horario estándar. Por ejemplo, si esta transición se produce en un día determinado a las 2:00 a. m. y hace que la hora cambie a 1:00 a. m., cada intervalo de tiempo entre las 1:00 a. m. y las 1:59:59 a. m. se puede interpretar como una hora estándar o un horario de verano.

Terminología de zona horaria

En la tabla siguiente se definen los términos usados comúnmente al trabajar con zonas horarias y desarrollar aplicaciones basadas en la zona horaria.

Término Definición
Regla de ajuste Una regla que define cuándo se produce la transición desde el horario estándar hacia el horario de verano y desde el horario de verano hacia el horario estándar. Cada regla de ajuste tiene una fecha de inicio y finalización que define cuándo está vigente la regla (por ejemplo, la regla de ajuste está vigente desde el 1 de enero de 1986 hasta el 31 de diciembre de 2006), un delta (la cantidad de tiempo que varía el horario estándar como resultado de la aplicación de la regla de ajuste) e información acerca de la fecha y hora específicas en las que se producen las transiciones durante el período de ajuste. Las transiciones pueden seguir una regla fija o una regla flotante.
Hora ambigua Una hora que se puede asignar a dos horas diferentes en una sola zona horaria. Esto sucede cuando la hora del reloj se atrasa, como durante la transición del horario de verano de una zona horaria al horario estándar. Por ejemplo, si esta transición se produce en un día determinado a las 2:00 a. m. y hace que la hora cambie a 1:00 a. m., cada intervalo de tiempo entre las 1:00 a. m. y las 1:59:59 a. m. se puede interpretar como una hora estándar o un horario de verano.
Regla fija Regla de ajuste que establece una fecha concreta para la transición hacia o desde el horario de verano. Por ejemplo, una transición desde el horario de verano hacia el horario estándar que se produce cada año el 25 de octubre sigue una regla de ajuste fija.
Regla flotante Regla de ajuste que establece un día concreto de una semana concreta de un mes determinado para la transición hacia o desde el horario de verano. Por ejemplo, una transición desde el horario estándar hacia el horario de verano que se produce el tercer domingo de marzo sigue una regla de ajuste flotante.
Hora no válida Hora no existente que resulta de la transición desde el horario estándar hacia el horario de verano. Esto sucede cuando la hora del reloj se adelanta, como durante la transición en una zona horaria desde el horario estándar hacia el horario de verano. Por ejemplo, si esta transición se produce en un día determinado a las 2:00 a. m. y hace que la hora cambie a 3:00 a. m., cada intervalo de tiempo entre las 2:00 a. m. y las 2:59:59 a. m. no es válida.
Tiempo de transición Información sobre un cambio horario concreto, como el cambio desde el horario de verano hacia el horario estándar o viceversa, en una zona horaria determinada.

Zonas horarias y la clase TimeZoneInfo

En .NET, un objeto TimeZoneInfo representa una zona horaria. La clase TimeZoneInfo incluye un método GetAdjustmentRules que devuelve una matriz de objetos TimeZoneInfo.AdjustmentRule. Cada elemento de esta matriz proporciona información sobre la transición hacia y desde el horario de verano durante un período de tiempo determinado. (Para las zonas horarias que no admiten el horario de verano, el método devuelve una matriz vacía). Cada objeto TimeZoneInfo.AdjustmentRule tiene una propiedad DaylightTransitionStart y DaylightTransitionEnd que define la fecha y hora concretas de la transición a y desde el horario de verano. La propiedad IsFixedDateRule indica si esa transición es fija o flotante.

.NET se basa en la información de zona horaria proporcionada por el sistema operativo Windows y almacenada en el registro. Debido al número de zonas horarias de la tierra, no todas las zonas horarias existentes se representan en el registro. Además, dado que el registro es una estructura dinámica, se pueden agregar o quitar zonas horarias predefinidas. Por último, el registro no contiene necesariamente datos históricos de zona horaria. Por ejemplo, en Windows XP, el registro contiene datos sobre un único conjunto de ajustes de zona horaria. Windows Vista admite datos dinámicos de zona horaria, lo que significa que una sola zona horaria puede tener varias reglas de ajuste que se aplican a intervalos específicos de años. Sin embargo, la mayoría de las zonas horarias que se definen en el registro de Windows Vista y admiten el horario de verano tienen solo una o dos reglas de ajuste predefinidas.

El que la clase TimeZoneInfo en el registro dependa del sistema operativo significa que una aplicación que tenga en cuenta la zona horaria no puede dar por hecho que una zona horaria determinada se haya definido en el registro. Por tanto, el intento de crear instancias de una zona horaria concreta (excepto la zona horaria local o la zona horaria que representa la hora UTC) debe usar el control de excepciones. También debe proporcionar algún método para permitir que la aplicación pueda continuar si no pueden crearse instancias del objeto TimeZoneInfo requerido.

Para controlar la ausencia de una zona horaria necesaria, la clase TimeZoneInfo incluye un método CreateCustomTimeZone, que puede usar para crear zonas horarias personalizadas que no se encuentran en el registro. Para obtener más información sobre cómo crear una zona horaria personalizada, consulte Cómo crear zonas horarias sin reglas de ajuste y Cómo crear zonas horarias con reglas de ajuste. Además, puede usar el método ToSerializedString para convertir una zona horaria recién creada en una cadena y guardarla en un almacén de datos (como una base de datos, un archivo de texto, el registro o un recurso de aplicación). A continuación, puede usar el método FromSerializedString para volver a convertir esta cadena en un objeto TimeZoneInfo. Para obtener más información, consulte Cómo guardar zonas horarias en un recurso incrustado y Cómo restaurar zonas horarias desde un recurso incrustado.

Dado que cada zona horaria se caracteriza por un desplazamiento desde la hora UTC base, así como por un desplazamiento desde la hora UTC que refleja las reglas de ajuste existentes, la hora de una zona horaria se puede convertir fácilmente en la hora de otra zona horaria. Con este propósito, el objeto TimeZoneInfo incluye varios métodos de conversión, como los siguientes:

  • ConvertTimeFromUtc, que convierte UTC a la hora en una zona horaria designada.

  • ConvertTimeToUtc, que convierte la hora en una zona horaria designada a UTC.

  • ConvertTime, que convierte la hora en una zona horaria designada a la hora de otra zona horaria designada.

  • ConvertTimeBySystemTimeZoneId, que usa identificadores de zona horaria (en lugar de objetos TimeZoneInfo) como parámetros para convertir la hora en una zona horaria designada a la hora de otra zona horaria designada.

Para obtener más información sobre cómo convertir horas entre zonas horarias, consulte Convertir horas entre zonas horarias.

Consulte también