Trabajar con fechas en JavaScript

Cómo trabajar con fechas en JavaScript

JavaScript es uno de los lenguajes más utilizados en la actualidad. El lenguaje fue famosamente concebido en tiempo récord para formar parte del navegador Netscape, y en ocasiones esto se nota, ya que tiene algunas características que pueden hacer que te lleves las manos a la cabeza.

Una de estas características que parece que no formaban “parte del plan” es el manejo de fechas con JavaScript. Las fechas son uno de los tipos de datos más importantes en programación ya que resultan indispensables en muchos sistemas. Sin embargo, el soporte de JavaScript para éstos elementos deja bastante que desear, y no está a la altura de lo que ofrecen otros lenguajes a día de hoy.

El constructor Date()

Los problemas empiezan con el constructor Date(). Podemos ver la fecha actual con

new Date();

Quizás el primer problema es justamente el hecho de que por defecto, genera la fecha actual. Es un comportamiento útil, pero quizás sería más claro si tuviese un método para generar la fecha de hoy (algo así como Date.now()).

Si queremos generar una fecha en un día concreto, primero le pasamos el año, luego el mes (de 0 a 11) y después el día. Podemos añadir la hora, minutos y segundos pasándole parámetros adicionales.

var fecha = new Date(2021, 6, 17, 12, 34, 22, 456);

Hasta aquí todo bastante lógico, el principal problema viene cuando queremos realizar una operación muy frecuente con las fechas: cambiar el formato de las mismas.

Formateando y leyendo fechas en JavaScript

Si utilizamos console.log(fecha); veremos que la fecha no está expresada en un formato que sea amigable para los seres humanos (en realidad para las máquinas tampoco). Si queremos expresarla de otro modo tenemos algunos métodos disponibles para ello como por ejemplo

fecha.toGMTString()

Que la expresa en formato GMT. Ahora bien, si el formato específico que deseas utilizar no está implementado, tendrás que obtenerlo a base de transformar los existentes.

En otros lenguajes hay una función para esto. Le pasas una fecha en el tipo de dato Fecha del lenguaje (cada uno usa el suyo), le especificas el formato que quieres que tenga el texto resultante y te devuelve la fecha exactamente como quieres.

Así puedes utilizar el tipo de dato Fecha para realizar operaciones con las fechas (calcular diferencias de tiempo, añadir o quitar días…) y luego puedes expresar el resultado como quieras a través de texto para guardarlo en una base de datos, por ejemplo.

Lo mismo ocurre al parsear (leer) fechas. Si no están en un formato que le guste a JavaScript, tendrás muchas dificultades para leerlas. En otros lenguajes puedes hacer el proceso inverso al anterior mediante una función equivalente. 

Le pasas un texto a ésta función y un formato que indica cómo está expresada la fecha, y te convierte el texto a un valor de Fecha con el que puedes operar.

JavaScript y las zonas horarias

Las fechas en javascript no soportan zonas horarias, solo las diferencias de tiempo entre la zona horaria y UTC. Podemos ver ésta diferencia para nuestra zona horaria con

fecha.getTimezoneOffset()

Si lo ejecutamos en Madrid obtenemos -120, que quiere decir que a la fecha que nos ha dado tenemos que restarle 120 minutos para obtener la fecha UTC.

Cuando creamos una fecha estará en nuestra zona horaria. No existe la posibilidad de especificarle al constructor la zona horaria en la que la queremos crear, sino que tendremos que averiguar cual es la diferencia horaria entre nuestra zona y la zona deseada, para después hacer el cálculo.

Uno de los círculos exteriores del infierno

Mientras estaba elaborando el artículo Leer y escribir datos con node.js, me dije ¿Qué tarea sencilla puedo plantear para practicar con la lectura y escritura de datos en el disco? 

Pensé que sería curioso crear un programa que almacena en un fichero la fecha y hora actuales cada vez que se ejecuta. Así, puedo saber cuantas veces se ha ejecutado o cuándo fue la última vez que se ejecutó. A partir de aquí sería trivial añadir algún mensaje y bum, tienes un log estructurado y fácilmente parseable.

Sobre el papel, era muy sencillo. Estimaba que en 15 minutos máximo lo tendría hecho porque recientemente había trabajado con lenguajes como Python, R y BASH. Todos ellos con excelentes funciones para tratar con fechas.  Incluso la mayoría de los gestores de bases de datos tienen buenas funciones para tratar con fechas, aunque sea un trabajo que a priori debería llegarles hecho.

Si alguna vez tienes que trabajar con fechas en JavaScript te recomiendo que te prepares una infusión relajante y te lo tomes con calma. Mejor evitar el café y otros estimulantes. Si fumas, fuma. Si no fumas, empieza.

Además librerías como Moment.js pueden hacer la tarea más fácil, pero en mi opinión no debería ser necesario cargar una librería externa para realizar operaciones básicas con fechas. 

A veces hay que sufrir y no hay otra opción. Otras veces podemos recurrir a profesionales con experiencia para que nos guíen y eviten que nos metamos una pistola en la boca / éstos dolores de cabeza. Nuestro Bootcamp Full Stack o nuestro Training te permitirán trabajar con la ayuda que necesitas para resolver tus dudas rápidamente y desarrollar tus conocimientos.

Autor

Manuel Torres

Selección de talento en OXYGEN

Valoración post
Ir arriba

¿Te gustaría dedicarte profesionalmente a programar?

Realiza un sencillo test y descubre si tienes las habilidades que requieren las empresas para contratarte.

Abrir Chat
1
¿Necesitas ayuda?
OXYGEN Academy
¡Hola! 👋 ¿Necesitas más información?