Introducción

No sé si sólo a mí me pasa o si sólo yo ocupo las fechas en Javascript, pero siempre que intento compararlas, algunas salen mal debido al offset. Sé que no se debe confiar en las fechas del cliente, pues se pueden cambiar, pero en alguna ocasión debimos necesitar trabajar con estas y puede que nos haya dado resultados inesperados.
Así que hoy mostraré cómo “ajustar el tiempo” de las fechas de Javascript utilizando getTimezoneOffset.

Descripción del problema

Esto pasa cuando creamos un objeto fecha utilizando una fecha como cadena. En donde la cadena es algo como “2018-03-05” (que representa el 5 de marzo del 2018 ). El objeto se crearía de la siguiente manera:

Nosotros esperamos que la fecha sea el 5 de marzo del 2018 a las 12 de la noche, o a las 00:00:00. Pero al imprimirlo...

Sorpresa. Dice que la fecha es del domingo (sunday) 4 de marzo a las 6 de la tarde. Y nosotros esperábamos que fuera del lunes 5 de marzo a las 0 horas.

Lo que está pasando aquí es que se están restando las horas del Tiempo universal coordinado (creo); en mi caso, como soy de México, resta 6 horas. ¿y si no estamos en México?

Javascript provee una forma de obtener el offset de la fecha. Y con ello podemos arreglar las fechas.

Vamos a ver la solución más abajo.

Solución

Esto es simple, al objeto que ya hemos creado vamos a ponerle el tiempo en milisegundos como el resultado de los milisegundos que ya tiene, sumando los milisegundos que resultan al obtener el offset. Para no confundirnos, se hace así:

Relacionado:  DOMContentLoaded en JavaScript

Expliquemos esto.

setTime recibe un número, que es el tiempo en milisegundos que han pasado desde la fecha unix.

getTimezoneOffset devuelve en minutos la diferencia de tiempos; en este caso devolverá 360, pues son 6 horas multiplicadas por 60 minutos.

Estos 360 minutos los multiplicamos por 60 para pasarlos a segundos, y luego al resultado lo multiplicamos por 1000 para convertirlo a milisegundos.

Con eso, hacemos la resta. Obtenemos los milisegundos que ya tiene la fecha con getTime y a eso le sumamos el resultado que obtuvimos arriba.

En pocas palabras, se le suman los milisegundos de la diferencia de horas. Si después de hacer esto imprimo la fecha, tengo esto:

Correcto. La fecha ahora sí es del lunes a las 12 de la noche. Y este método, me parece, funciona para cualquier zona horaria.

Así, podemos arreglar y ajustar fechas en Javascript sin perder la cabeza.

Conclusión

Cabe mencionar que esto sólo me ha pasado al instanciar objetos con una fecha ya existente; si se instancia y no se le pasan parámetros, todo va bien. Es decir, si hago lo siguiente todo va bien:

Se desajusta cuando al constructor de Date le paso una cadena como argumento.


Estoy disponible para trabajar en tu proyecto o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.
Si el post fue de tu agrado muestra tu apoyo compartiéndolo, suscribiéndote al blog, siguiéndome o realizando una donación.

Suscribir por correo

Ingresa tu correo y recibirás mis últimas entradas sobre programación, open source, bases de datos y todo lo relacionado con informática

Únete a otros 812 suscriptores

Relacionado:  Const, var y let en JavaScript: diferencias y explicación


parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

1 Comment

Sumar y restar fechas en Javascript - Parzibyte's blog - El blog de Luis Cabrera · mayo 14, 2018 a las 9:43 am

[…] En este caso será la fecha de mañana, aunque dicha fecha puede venir de cualquier lado. Recuerda que si la fecha es una cadena debes ajustar su tiempo. […]

Deja un comentario

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

A %d blogueros les gusta esto: