Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

144
Vistas
¿Por qué hay 1/4 de día adicional en este cálculo de tiempo?

Estaba tratando de hacer un cálculo de fecha básico como se ve a continuación. Quiero encontrar los días restantes en el mes dados los argumentos a continuación.

Pensé que había determinado una solución, pero parece haber un 1/4 adicional en la respuesta.

 // returns last day of month function lastDayOfMonth(date) { return new Date(date.getFullYear(), date.getMonth() + 1, 0) } let day_start = new Date('2018-11-04'); let day_end = new Date('2019-01-10'); let day_last = lastDayOfMonth(day_start); let total = 0; if (day_end <= day_last) { total = day_end - day_start; } else { total = day_last - day_start; } console.log(total / (1000 * 60 * 60 * 24)); // returns 26.25

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

El constructor de Date que usa el formato, new Date(year, month, day) se evalúa usando su zona horaria local. El constructor de Date para la cadena ISO 8601, YYYY-MM-DD se evalúa en UTC.

Puede resolver esto imprimiendo su fecha local en formato ISO 8601 y pasándola a un objeto Fecha recién construido.

 function lastDayOfMonth(date) { let localDate=new Date(date.getFullYear(), date.getMonth()+1, 0); let m=localDate.getMonth(); let d=localDate.getDate(); return new Date(localDate.getFullYear()+'-'+(m<10?'0':'')+m+'-'+ (d<10?'0':'')+d); }
about 4 years ago · Juan Pablo Isaza Denunciar

0

La diferencia proviene del desplazamiento UTC, ya que, como lo ha escrito, day_start y day_end son medianoche UTC, pero day_last es medianoche en su zona horaria local.

Para solucionarlo, simplemente haga todos los cálculos en UTC. Dado que day_last es el único que es local, este es el único que necesita ajustar. Para producir esto en UTC, puede usar setUTCFullYear y métodos relacionados (lamentablemente, no creo que haya una manera de hacerlo con el constructor de Date ):

 // returns last day of month function lastDayOfMonth(date) { // Set correct date in UTC: let last_date = new Date(); last_date.setUTCFullYear(date.getFullYear()); last_date.setUTCMonth(date.getMonth() + 1); last_date.setUTCDate(0); // Zero out the time so that this will end up as midnight: last_date.setUTCHours(0); last_date.setUTCMinutes(0); last_date.setUTCSeconds(0); last_date.setUTCMilliseconds(0); return last_date; } let day_start = new Date('2018-11-04'); let day_end = new Date('2019-01-10'); let day_last = lastDayOfMonth(day_start); let total = 0; if (day_end <= day_last) { total = day_end - day_start; } else { total = day_last - day_start; } console.log(total / (1000 * 60 * 60 * 24)); // returns 26 flat

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda