La primera vez que desarrollas un software para usuarios que están en diferentes zonas horarias, aparecen dudas sobre cómo guardar y manipular las fechas y horas.
La tarjeta de embarque de @Iberia tenía errata. El vuelo duró 1 hora y no 11h 😀 #vientodecola #bug #madrid #lisboa pic.twitter.com/nwLNmdeGbo
— Javier Campos (@javichur) March 19, 2016
Posible error de timezone, visto en una tarjeta de embarque.
Recomiendo empezar leyendo este link para entender los conceptos principales. Una zona horaria es un espacio de la tierra que tiene una hora uniforme que está regulada por ley. No es simplemente un número que indique el offset con respecto a UTC. Por ejemplo, en una determinada zona horaria hoy podría ser +1 hora respecto UTC pero en otro momento de la historia pudo ser +2.
En Javascript existe el objeto Date, que almacena una fecha y hora como el nº de milisegundos transcurridos desde 1/1/1970 a las 00:00 UTC. Pero el navegador web, al leer el valor de una instancia Date, lo visualiza con la timezone del usuario. Por eso, un mismo nº de milisegundos desde 1/1/1970 00:00 (guardado en un objeto Date) se visualiza diferente por un usuario web de España y uno de Estados Unidos.
Obtener la fecha y hora de una determinada timezone a partir de la fecha y hora de otra timezone no es trivial en Javascript. Es decir, no es trivial saber qué hora era en Los Ángeles cuando en España eran las 21:15 del 1 de mayo de 1992 por ejemplo. Para poder hacer esa conversión necesitaríamos información de todos los cambios horarios (leyes) en ambas zonas horarias desde el 1/1/1970 00:00 hasta mayo de 1992. Pero no hay que reinventar la rueda, ya existen librerías con toda esta información 🙂
En resumen, la única forma que tenemos de manipular el timezone en Javascript es con librerías externas como timezone de momentjs o la nueva librería Luxon.
Para los proyectos web, se recomienda que los servidores estén todos configurados con UTC, almacenen las fechas en UTC y guarden además para cada usuario su zona horaria. Así lo hace Google Calendar por ejemplo, para poder mostrarte los eventos que has creado en la hora local del lugar en el que estés, aunque cambies de lugar.
Para terminar, he desarrollado una skill para Alexa llamada «Nevera Estado». Esta skill permite a cualquier usuario decir qué productos mete en su nevera y cuál es su fecha de caducidad. La skill avisa cuando un producto caduca hoy, mañana, pasado mañana o ya ha caducado. Los objetivos de esta skill son demostrar qué tipo de aplicaciones puede haber en el futuro en nuestras neveras usando la voz, ayudar a desperdiciar menos alimentos y evitar el consumo de productos en mal estado (sobretodo productos abiertos cuya fecha de caducidad se reduce).
Para que esta skill funcione desde cualquier zona horaria, el backend está configurado en UTC, conoce la timezone de cada usuario y hace la conversión necesaria utilizando la librería moment-timezone comentada anteriormente.
Para conocer la zona horaria de cada usuario de Amazon Alexa no hace falta pedir al usuario que pronuncie el nombre de su zona, sino que hay una API oficial.
He publicado en github el código fuente de dicha skill Alexa.