En el ámbito de los proyectos locales y personales, la gestión de la zona horaria suele pasar a un segundo plano, y tendemos a dar prioridad a que nuestras aplicaciones sean accesibles y funcionales para un público global. Sin embargo, en cuanto se pasa a un entorno de producción y el producto amplía sus servicios más allá de la zona horaria local, empiezan a surgir complejidades.

Imaginemos lo siguiente: hemos desarrollado un producto de servicio basado en franjas horarias y nuestro proveedor de servicios se encuentra en la India, mientras que el cliente reside en Canadá. Ahora surge la pregunta: ¿cómo se debe mostrar y gestionar el tiempo para acomodar eficazmente a ambas partes? Estos son los retos que pueden convertir la vida de un desarrollador en un auténtico rompecabezas.

Las ramificaciones de una gestión inadecuada de la zona horaria van mucho más allá de los desarrolladores; tienen un impacto sustancial en sus clientes, ya que todo el servicio depende de una gestión precisa de la zona horaria.

El papel de las zonas horarias


Las zonas horarias son regiones de la Tierra que tienen la misma hora estándar. Existen porque la Tierra está dividida en líneas longitudinales y, como la Tierra gira, las distintas partes del mundo experimentan la luz del día y la oscuridad a horas diferentes.

Las zonas horarias son una forma de estandarizar el cronometraje en todo el mundo, garantizando que las personas puedan coordinar sus actividades y horarios independientemente de su ubicación geográfica.

¿Por qué necesitamos la normalización de la zona horaria?


Implantar una zona horaria normalizada en las aplicaciones es crucial por varias razones:

  1. Coherencia: La estandarización de una zona horaria, como el Tiempo Universal Coordinado (UTC), garantiza la coherencia en toda la aplicación. Todas las marcas de tiempo y los datos relacionados con la hora seguirán las mismas reglas, lo que facilitará la gestión y comparación de los datos de tiempo con precisión.
  2. Base de usuarios global: Si su aplicación sirve a usuarios de diferentes partes del mundo, el uso de una zona horaria estandarizada ayuda a evitar confusiones y garantiza que los usuarios puedan entender e interactuar con la información relacionada con la hora de forma coherente, independientemente de su ubicación.
  3. Integridad de los datos: Las zonas horarias estandarizadas ayudan a mantener la integridad de los datos. Cuando todas las marcas de tiempo están en una zona horaria coherente, es menos probable que se produzcan errores debido a datos de tiempo no coincidentes o ambiguos.
  4. Sincronización: Cuando múltiples componentes de una aplicación necesitan trabajar juntos, tener una zona horaria estandarizada simplifica la coordinación. Asegura que todas las partes de la aplicación están en la misma página en lo que respecta a los eventos relacionados con el tiempo y la programación.

Descodificación de marcas de tiempo


La marca de tiempo '2021-10-03T14:00:00.000+00:00' es un formato comúnmente generado por las bases de datos, y proporciona información valiosa sobre la fecha, la hora y la zona horaria. Desglosemos esta marca de tiempo:

  • 2021-10-03' representa claramente la fecha.
  • La 'T' sirve de separador, como exige el formato combinado fecha-hora ISO 8601, seguido de la hora.
  • La información crucial reside en "+00:00". Este valor concreto significa el desfase con respecto al Tiempo Universal Coordinado (UTC). En este caso concreto, indica que esta marca de tiempo es exactamente las 00:00, lo que significa que tiene cero horas y cero minutos de desfase con respecto al UTC.
const currentDate = new Date(); //creating date object
const specificDate = new Date(1630915200000); // Represents September 6, 2022, 12:00:00 AM UTC

//utility date functions for getting information
const year = date.getFullYear();
const month = date.getMonth(); // 0-based (0 represents January)
const day = date.getDate();
const hour = date.getHours();
const minute = date.getMinutes();
const second = date.getSeconds();
const millisecond = date.getMilliseconds();

//formatting dates
const formattedDate = date.toDateString(); // "Tue Sep 06 2022"

La principal limitación del objeto Date de JavaScript reside en su gestión de las zonas horarias por defecto.

JavaScript interpreta los objetos Date basándose en la zona horaria local, lo que puede plantear problemas cuando se requiere una gestión precisa de la zona horaria. Para solucionar esta limitación y satisfacer necesidades específicas relacionadas con la zona horaria, los desarrolladores suelen recurrir a paquetes o bibliotecas externas.

Por qué Moment.Js


Moment.js es una biblioteca de JavaScript muy utilizada que simplifica el trabajo con fechas y horas en aplicaciones web. Ofrece una API fácil de usar para el análisis sintáctico, el formateo y la manipulación de fechas, junto con un sólido soporte de zonas horarias y funciones de internacionalización.

  • Simplicidad: Moment.js proporciona una API sencilla y fácil de usar para analizar, manipular y dar formato a fechas y horas.
  • Análisis coherente: Ofrece sólidas capacidades de análisis sintáctico de fechas, garantizando que las cadenas de fechas en varios formatos se analicen de forma coherente en diferentes navegadores.
  • Formato flexible: Puede formatear fácilmente fechas y horas en una amplia gama de formatos personalizables, lo que lo hace adecuado para diversas interfaces de usuario.
  • Manejo de zonas horarias: Moment.js es excelente en el manejo de zonas horarias, lo que le permite convertir fácilmente entre diferentes zonas horarias y realizar cálculos sensibles a la zona horaria.
//Creating date time object in moment
let date = moment(); //current date and time

//create date object from a string
let stringDate = moment('2023-06-10', 'YYYY-MM-DD');

//formatting date in different formats
console.log(date.format('YYYY-MM-DD HH:mm:ss'));
 
//adding/subtracting time from date
const futureDate = moment().add(3, 'days');
const pastDate = moment().subtract(2, 'hours');

//diff btw two dates
const date1 = moment("2023-09-20");
const date2 = moment("2023-09-10");
const duration = moment.duration(date1.diff(date2));

//converting date object to utc
let utcDate = moment().utc();

//conveting date object to different timezones
let istDate = moment().utcOffSet('+05:30').toDate(); //based upon offset

Conclusión


Basándome en mi experiencia en la gestión de zonas horarias en múltiples proyectos que dependen en gran medida de la programación de franjas horarias, he llegado a una solución. Consiste en utilizar el Tiempo Universal Coordinado (UTC) como zona horaria por defecto para las operaciones del lado del servidor y almacenar las marcas horarias en las bases de datos en formato UTC. Esta elección garantiza la coherencia entre varios servicios que funcionan inherentemente en UTC.

Para aplicar eficazmente esta solución, abogo por el uso de utilidades globales de manejo de la hora dentro de un proyecto. Esto significa centralizar todo el formato de fecha y hora a través de una función de utilidad común.

En lo que respecta al análisis sintáctico de las zonas horarias en el lado del cliente, ofrece flexibilidad y eficacia. Al recibir respuestas con marcas de tiempo UTC, se elimina la necesidad de un extenso análisis sintáctico y formateo en el lado del servidor. Este enfoque permite realizar conversiones dinámicas de las marcas horarias en función de la ubicación del cliente, lo que suele ser un requisito práctico.

Sin embargo, si los requisitos del producto son específicos de una región y no requieren un análisis sintáctico del lado del cliente, el enfoque del lado del servidor puede ser igualmente eficaz. En este caso, no es necesario escribir código relacionado con la zona horaria en el lado del cliente.

En conclusión, la elección entre el análisis sintáctico en el lado del cliente y el formateo en el lado del servidor depende de las necesidades específicas de su proyecto.

Mientras que el análisis sintáctico del lado del cliente ofrece adaptabilidad para casos de uso global, el formateo del lado del servidor puede simplificar el desarrollo para requisitos específicos de una región.

import moment from "moment";

function DateHandler(date: Date): string {
  let finalDate = moment(date).utcOffset("+05:30").format("MMMM Do, YYYY");
  return finalDate;
}

export default DateHandler;

Fuente