¡Maldita hora!

Desde que empecé a programar en el 2015. La hora ha sido uno de los quebraderos de cabeza que más han perdurado en el tiempo, no solo por mi desconocimiento en su uso si no por lo mala implementación que tiene en alguno de los sistemas legacy.

Algunos la prefieren guardar tal cual se ve en el reloj, otros con el huso horario incorrecto, algunos como el usuario lo va a visualizar… ¿Por que no la guardamos con algún estándar en base de datos y la mostramos como cada usuario quiere verla?

¿Que es la hora o el tiempo?

La hora es una unidad de tiempo utilizada globalmente. Fue implantada por los egipcios y posteriormente adoptada por los romanos y su duración a variado hasta ahora. Actualmente una hora representa la veinticuatroava parte del día solar aparente1 , por lo que en un día tenemos 24 horas. Para representar de manera más precisa un momento, se añadieron los minutos y lo segundos, teniendo 60 minutos en una hora y 60 segundos en un minuto.

Las 12:00 se sitúan cuando el sol se encuentra en su posición más alta en su órbita. Debido a que esto varia dependiendo de la ubicación en la tierra, no en todos lugares tenemos la misma.

Husos horarios

Los husos horarios son zonas geográficas en las que el sol se encuentra en la misma posición relativa en un momento dado. Para facilitar el uso, se definen 24 franjas que dividen la tierra de norte a sur del mismo tamaño identificándolas desde la -12 hasta la 12. Cada una de las franjas tendrá una hora diferente, la franja contigua hacia el oeste tendrá 1 hora más, mientras que la opuesta tendrá una hora menos.

Zonas horarias

Los husos horarios no son utilizados para fijar la hora en un lugar. Para ello tenemos las zonas horarias que establecen la hora local.

Las zonas horarias son definidas por la posición geográfica pero pueden ser movidas por motivos políticos o facilitar la coordinación entre las regiones. Algunos casos cercanos es España, que aunque esta en el mismo huso horario que Reino Unido, utiliza la zona horaria del centro de Europa para poder coordinarse con el resto de países.

Estandarización del tiempo

Teniendo esto en cuenta. Se debía determinar en que franja estaría la hora base de la cual se calcularían el resto de las franjas. Para ello, se lanzo UTC (Tiempo universal coordinado) que es la hora que hay en el meridiano de Greenwich el cual se toma como referencia.

Cada una de las husos horarios tienen la hora UTC+N siendo N el desplazamiento correspondiente al huso. En el meridiano de Greenwich tendremos UTC+0, mientras que en Berlín, que estamos en el huso horario 1, tendremos UTC+1. Como hemos comentado anteriormente, esta hora no corresponde con el huso horario que puede variar por diversos motivos. Por tanto, para conocer la hora local no nos podemos basar en el huso horario y debemos de conocer las zonas horarias.

¿Como gestionamos la hora en el desarrollo de software?

Ahora que sabemos como funcionan las zonas horarias. Vamos a ver como un ordenador la gestiona internamente y que herramientas disponemos para poder operar con ella de la forma más optima.

Los ordenadores basados en Unix utilizan la Unix Time como medida de referencia. Se representa como el número de segundos que han pasado desde el 1 de Enero de 1970 UTC. Utilizarla trae consigo una serie de ventajas

  • Representación: Se guarda como un número entero de 32 bits.
  • Operaciones: Es muy fácil de operar con operadores simples como la suma, la resta y la división.
  • Interoperable: La mayoría de librería traen consigo parsers.

Como vemos, utilizar la hora como Unix Time es muy sencillo y la mayoría de veces será suficiente. Pero presenta algunos inconvenientes que deberán de ser tenidos en cuenta, uno de ellos es que no especifica explícitamente la unidad y al compartir este valor entre diferentes sistemas se le pierde la pista. Tenemos algunas librerías que lo devuelven en segundos y otros en milisegundos, por lo que es responsabilidad del desarrollador saber con que esta operando.

Con una buena documentación no debería de ser un problema, pero fácilmente puede llevar a errores. En algunos códigos, he visto como se han utilizado funciones que apartir del número de dígitos determina su unidad, lo que llevará a errores cuando esta regla deje de ser válida.

Como hemos visto, puede ser interesante el Unix Time para el uso interno de la aplicación debido a la facilidad del uso. Pero en el caso de que queramos compartir esta información a través de una API por ejemplo, necesitaremos una forma en la que no haya posibilidad de error. Para ello se definió el ISO 8601.

El estandar ISO 8601

El estandar ISO 8601 nos permite representar instantes de una forma no ambigua a través de una cadena de texto. La primera especificación se realizo en el 1988 unificando y sustituyendo varias normas anteriores, ha tenido varías actualizaciones desde entonces.

Esta norma nos permite representar la hora local, la hora UTC y la zona horaria de una forma sencilla. Veamos la forma más completa:


  • Fecha: Es la fecha que se quiere representar con el formato <año>-<mes>-<día>.
  • Separador: El separador T permite conocer donde empieza la hora.
  • Hora: La hora con el formato <hora>:<minuto>:<segundo>.
  • Offset: Indica la zona horaria. La Z indica que esta en UTC.

  • Offset: En este caso nos indica que la hora tiene un desplazamiento de +1. Es decir, en UTC son las 13:57:04.

  • Sin offset: Este caso no es recomendado, pues no se especifica el OFFSET y se interpreta como la hora local. Dependiendo de la ubicación del sistema se le añadirá un offset diferente.

  • Hora: A la hora se le puede añadir los milisegundos separado con un <punto>.

  • Fecha: También se puede indicar la fecha sin hora.

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *