Saltar al contenido
Marcos Peña
Menú
  • Acerca de…
Menú

horario de verano y javascript

Publicada el marzo 3, 2021marzo 3, 2021 por Marcos

Escenario

Con el fin de dibujar una gráfica cronológica, necesito generar en javascript una matriz de fechas a partir de una de inicio y otra de fin. En stackoverflow doy con una solución que considero sencilla e inteligible:
JavaScript
1
2
3
4
5
6
7
8
const getDaysArray = function (start, end) {
    let days = []
    let day;
    for (days, day = new Date(start); day <= end; day.setDate(day.getDate() + 1)) {
        days.push(day.toISOString().split('T')[0]);
    }
    return days;
};
Tras modificarla lo justo y probarla compruebo que devuelve una matriz de fechas de tipo '2019-02-01','2019-02-02','2019-02-03','2019-02-04'…

Problema

Un buen día nos damos cuenta que falta un día en el gráfico de nuestra aplicación. Lo primero que pensamos es en la base de datos. Pero no es así, no falta ninguno. El día en cuestión en es el 27 de octubre de 2019. ¿Qué tendrá ese día que no se niega a aparecer en el gráfico?. Una de sus peculiaridades es que coincidió con el cambio de horario de invierno del año 2019. Enseguida me vino a la cabeza un error que viví hace años en el que una fecha nos trajo de cabeza hasta que vimos que caía justo en esa hora inexistente resultante del adelanto de una hora. Depuré el código, y el bucle devolvía correctamente la fecha, pero al convertirla a literal con el método toISOString(), aplicacaba el huso horario UTC que, en el caso del horario de verano es dos horas menos, y en el otro solo una. De ahí que en un caso la convierte al día anterior y, en el otro, respeta el día.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Date Thu Oct 24 2019 01:00:00 GMT+0200 (Central European Summer Time)
2019-10-23T23:00:00.000Z
 
Date Fri Oct 25 2019 01:00:00 GMT+0200 (Central European Summer Time)
2019-10-24T23:00:00.000Z
 
Date Sat Oct 26 2019 01:00:00 GMT+0200 (Central European Summer Time)
2019-10-25T23:00:00.000Z
 
Date Sun Oct 27 2019 01:00:00 GMT+0200 (Central European Summer Time)
2019-10-26T23:00:00.000Z
 
Date Mon Oct 28 2019 01:00:00 GMT+0100 (Central European Standard Time)
2019-10-28T00:00:00.000Z

Solución

Una posible solución sería convertir la fecha a UTC antes de aplicar la conversión a literal. Yo he optado por definir a piñón la hora del día, evitando así que el horario de verano vuelva a interferir:
JavaScript
1
2
3
4
5
6
7
8
9
const getDaysArray = function (start, end) {
    let days = []
    let day;
    for (days, day = new Date(start); day <= end; day.setDate(day.getDate() + 1)) {
        day.setHours(11); // <- hora a piñón
        days.push(day.toISOString().split('T')[0]);
    }
    return days;
};

Deja una respuesta Cancelar la respuesta

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

Artículos

  • abril 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • junio 2021
  • mayo 2021
  • abril 2021
  • marzo 2021
  • febrero 2021
  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • noviembre 2018
  • octubre 2018
  • julio 2016
  • mayo 2016
  • abril 2016
  • agosto 2015
  • febrero 2014
  • junio 2013
  • febrero 2013
  • noviembre 2012
  • octubre 2012
  • septiembre 2012
  • abril 2012
  • enero 2012

Categorías

  • Cómo
  • Consejos
  • Hacks
  • Sin sentido
  • Tutorial

Etiquetas

apache API aws cache Centos Codeigniter EAC firefox flash freebsd freenas gmail Google guacamole java Javascript jQuery kubuntu Linux mysql nas4free nginx php plesk postfix python react rtorrent Seguridad sftp sonata-admin spring spring-boot sql ssh ssl symfony symfony2 symfony4 thymeleaf ubuntu vnc wget windows wine

Entradas recientes

  • Confirmación antes de apagar
  • cURL error 60: SSL certificate problem: unable to get local issuer certificate
  • Oracle JDK 7 is NOT installed.
  • ssh: connect to host: Connection refused
  • Restringir acceso a un bucket de AWS s3 por IP

Comentarios recientes

  • Marcos en Deobbing flash
  • Irosales en Deobbing flash
  • Instalación certificado SSL de un vendedor – Marcos Peña en Instala un certificado SSL en tres pasos
  • gerMdz en Cómo instalar un certificado letsencrypt para un sitio gestionado por Cloudflare
  • Jose Olalla en Cómo ampliar el espacio en disco en 1and1

Archivos

  • abril 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • junio 2021
  • mayo 2021
  • abril 2021
  • marzo 2021
  • febrero 2021
  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • noviembre 2018
  • octubre 2018
  • julio 2016
  • mayo 2016
  • abril 2016
  • agosto 2015
  • febrero 2014
  • junio 2013
  • febrero 2013
  • noviembre 2012
  • octubre 2012
  • septiembre 2012
  • abril 2012
  • enero 2012

Categorías

  • Cómo
  • Consejos
  • Hacks
  • Sin sentido
  • Tutorial

Meta

  • Acceder
  • Feed de entradas
  • Feed de comentarios
  • WordPress.org
© 2022 Marcos Peña | Funciona con Minimalist Blog Tema para WordPress