Fecha y hora: Conceptos básicos

En este artículo se comentarán conceptos que van más allá de la terminología básica que aparece en otros artículos sobre las zonas horarias o el uso de fechas y horas en la Web.

El documento Working with Time Zones incluye más información sobre cómo gestionar estos conceptos en la Web. Se recomienda su lectura para ampliar conocimientos.

Hora UTC

La hora UTC suele identificarse con la hora GMT (del inglés Greenwich Mean Time, hora del meridiano de Greenwich). Las diferencias entre ambos términos no son notables, ni posiblemente conocidas por el usuario de a pie.

El Tiempo Universal Coordinado (UTC, siglas del inglés Universal Coordinated Time) es el estándar por el cual se regulan los relojes y el tiempo. Asimismo, se utiliza como base para indicar la hora incremental y la hora local.

El ajuste de zona horaria para la hora UTC es 0. Esta se indica normalmente en formatos de campo con la letra Z.

Formatos de campo horario

Al escribir una hora con un formato de campo, se divide la fecha y el tiempo en valores de campo separados como el año, el mes, el día, la hora, el minuto, el segundo, etc., por ejemplo, 11/09/2016 06:10:32. Si lo comparamos con otra forma de indicar la misma hora, por ejemplo, 1465621816590, veremos que es difícil de interpretar si no está en un formato de campo.

Los formatos de campo horario pueden estar vinculados o no a la hora UTC o a la zona horaria local y no suelen ser formatos determinados. Suelen estar vinculados a un calendario específico (como el calendario gregoriano).

Los formatos que introdujo el estándar ISO 8601 también se consideran formatos de campo.

Hora incremental

La hora incremental es una manera de indicar el tiempo en los ordenadores basada en una progresión de unidades enteras fijas que van avanzando de manera monótona desde un punto de partida específico en el tiempo (llamado «época»).

Java (entre otros sistemas) representa la hora como el número de milisegundos desde medianoche (00:00 a. m.) del día 1 de enero de 1970 en hora UTC (restando todos los segundos intercalares transcurridos). Otros sistemas usan unidades y épocas distintas.

Por ejemplo, mientras redactaba este apartado, la hora progresiva de JavaScript en mi buscador era 1465621816590, es decir, 11 de junio de 2016 a las 6:10 a. m. en horario de verano británico (BST, del inglés British Summer Time).

La mayoría de los lenguajes de programación y entornos operativos utilizan la hora incremental para indicar valores temporales. No obstante, la hora incremental no suele ser visible directamente por los usuarios, sino que es asignada normalmente a un formato de campo horario para su interpretación o para el consumo humano.

Tiempo real u hora local

El tiempo real o la hora local es un momento específico en el tiempo que puede ser asignado a un punto concreto en hora incremental si se aplica alguna información relevante de la zona horaria. Sin embargo, no es más que la fecha o la hora que marcaría un reloj o un calendario colgado en una pared.

Por ejemplo, cuando se redactaba la sección anterior, la fecha y hora que mostraba mi ordenador era sábado 11 de junio, 06:10. Si se quisiera interpretar esa hora en hora UTC (en mi caso, ajustándola al horario de verano británico) se podría interpretar en la hora incremental 1465621816590.

También es posible convertir esa hora al tiempo real de otra ubicación. Por ejemplo, en ese mismo instante una persona que estuviera en San Francisco visualizaría viernes 10 de junio, 22:10.

Hora flotante

Existen algunos valores de hora que no tienen asignado ninguna hora incremental, sino que representan un tiempo nominal común a todas las zonas horarias del mundo.

Por ejemplo, el sábado 11 de junio de 2016 es el día del 90 cumpleaños oficial de la reina de Inglaterra. El momento exacto en el que empieza o acaba el 11 de junio en Reino Unido puede ser viernes o domingo en otros países, ya que sus relojes marcarán otra hora, pero la fecha de este evento seguirá siendo siempre el sábado 11 de junio.

Estos valores de hora se denominan horas flotantes porque no están sujetas a ningún valor de hora incremental específico. Al añadir información sobre la zona horaria a las horas flotantes, estas muestran una serie de valores de hora incremental.

Las horas flotantes no están, ni deben estar, sujetas a ninguna zona horaria concreta.

Otros ejemplos de acontecimientos con hora flotante serían la fecha de publicación de algún tema de un periódico, la fecha en la que empiezan las Olimpiadas de Río, el Año Nuevo, los horarios de oficina de 9:00 a 17:00 independientemente de la zona horaria, etc.

Zona horaria

Una zona horaria es un conjunto de normas que sirven para determinar la hora local (o tiempo real) asociada a una hora incremental (como en la mayoría de sistemas informáticos) para una región geográfica determinada y viceversa.

Entre las normas de la zona horaria hay que tener en cuenta los ajustes de zona horaria, además de cualquier modificación que haya que aplicar al tiempo real debido al horario de verano.

Ajuste de zona horaria

Un ajuste de zona horaria es una cantidad que se suma o se resta a la hora UTC según la ubicación del evento con respecto al primer meridiano. Normalmente estos ajustes son de intervalos de una hora, pero también pueden ser de 30 o 45 minutos.

La manera habitual de marcar este ajuste de zona horaria en los formatos de campo es a través de los signos +/- seguido del ajuste horario en sí. Por ejemplo, Japón está ubicado a 9 horas por delante de la hora UTC, por lo que se interpretaría 11/06/2016 05:10+09:00.

Hay que tener en cuenta que el ajuste de zona horaria no hace el cambio en las horas locales donde hay aplicado ya un horario de verano.

Horario de verano

El horario de verano (también DST, del inglés Daylight Saving Time) se adoptó con el fin de añadir más horas de sol por la tarde.

El horario de verano varía según el país (incluso la localidad) y a menudo se hacen excepciones para adaptarse a acontecimientos especiales. No todas las regiones tienen horario de verano, ya que aquellas próximas al ecuador no lo necesitan.

En los cambios de hora es muy importante tener en cuenta cuándo se aplicó el horario de verano o si ya no se aplica en esa zona local, además de los días en los que empiezan y terminan el horario de verano (que pueden variar de un año a otro).

Por ejemplo, la hora estándar de Corea y de Japón tienen el mismo ajuste de zona horaria y no tienen horario de verano. Sin embargo, Japón dejó de aplicar el horario de verano en 1951, mientras que Corea del Sur dejó de aplicarlo en 1988, por lo que si un programa quisiera indicar la hora de algún momento anterior a estos años, tendría que trabajar esas zonas horarias por separado.

Identificadores de la zona horaria

Los identificadores de la zona horaria te permiten observar una diferencia concreta de la hora UTC, que incluye tanto el ajuste de zona horaria como el horario de verano.

La mejor referencia para identificar conjuntos de normas de zona horaria es la base de datos TZ (también conocida como la base de datos Olson), que se usa en sistemas operativos comerciales UNIX como Linux, Java, CLDR, ICU y muchos otros, además de en bibliotecas. También existen otros sistemas, como Microsoft Windows, que usan su propio conjunto de datos e identificadores.

En la base de datos TZ se usan identificadores para la zona horaria formados normalmente por una región y una ciudad de ejemplo. Una ciudad de ejemplo es una ciudad ubicada en la zona horaria en cuestión, lo bastante conocida por la población para usarla de referencia de esa zona horaria. Por ejemplo, la hora del Pacífico de EE. UU. tiene la siguiente base de datos TZ: America/Los_Angeles. La base de datos TZ también utiliza apodos para algunos identificadores, por ejemplo, Asia/Ulan Bator es el equivalente de Asia/Ulaanbaatar.

El Common Locale Data Repository (CLDR) se puede utilizar para aportar una forma localizada a los identificadores. Hay que tener en cuenta que algunos sistemas, como el sistema operativo Apple Mac OS, añaden otras ciudades de ejemplo adicionales.

Calendario gregoriano y otros calendarios

El calendario gregoriano es el método más utilizado para representar la hora civil. Se trata de un calendario solar basado en 365 días al añ, excepto los años bisiestos, que añaden un día extra cada 4 años.

También se usan otros calendarios en el mundo, como los calendarios lunares, otros que tienen una fecha de inicio distinta a la del calendario gregoriano y otros que se reinician cada vez que muere alguna persona destacada. A menudo se usan estos calendarios con fines religiosos, aunque también se pueden encontrar en periódicos, correos electrónicos o fechas de nacimiento.

Existen tecnologías, como ICU o Dojo, que ayudan a la conversión de los distintos sistemas de calendario.

Términos HTML5

A continuación, como referencia, se muestran algunos ejemplos de fechas y horas para términos que se usan en especificaciones de HTML5.

fecha y hora global
Una fecha de 8 dígitos, separados de la hora con un espacio o una T; una hora de 4 a 9 dígitos (obligatorios), un ajuste de zona horaria (obligatorio) interpretado con una Z o +/- y 2 dígitos y con la opción de añadir los segundos:
25/05/2016T21:19:47.123+08
25/05/2016 21:19:47-08
25/05/2016 21:19:47Z
25/05/2016 21:19:00.123+23:45
fecha y hora global normalizadas
Igual que el anterior, a excepción de que la T es obligatoria, 00 se omite en el campo de segundos y el ajuste de zona horaria puede ser solo Z:
25/05/2016T21:19:47.123Z
25/05/2016T21:19Z
fecha y hora global flotantes
Igual que la fecha y hora global sin información de ajuste de zona horaria:
25/05/2016T21:19:47.123
25/05/2016 21:19:00
fecha y hora global normalizadas y flotantes
Igual que el anterior, a excepción de que la T es obligatoria y 00 se omite en el campo de segundos:
25/05/2016T21:19:47.123
25/05/2016T21