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

130
Vistas
Captura todos los viernes, domingos y miércoles entre dos fechas

Buenas noches. Estoy tratando de capturar todos los viernes, domingos y miércoles entre dos fechas usando Moment.js. No podía entender por qué no captura los días:

  • 2021-12-08
  • 2021-12-10

Me las arreglé para llegar tan lejos:

 const allDays = [0, 3, 5]; function formatToPush(dt_inicio, dt_final, dia, horas) { let start = moment(dt_inicio); let end = moment(dt_final); let result = []; let datas = []; let current = start.clone(); if ((current.day(dia).isSameOrAfter(start)) || (current.day(dia).isSameOrAfter(end)) || (current.day(7 + dia).isSameOrBefore(end))) { result.push(current.clone()); } result.map(m => { horas.map(h => { m.set({ hour: h.split(':')[0], minute: h.split(':')[1], second: 0, millisecond: 0 }); datas.push(m.format('YYYY-MM-DD HH:mm:ss')) }) }); return datas; } let final = []; for (let i in allDays) { final.push(...formatToPush('2021-12-01', '2021-12-10', allDays[i], ["10:00", "16:00", "22:30"])) } console.log(final)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

¿Alguien puede ayudarme a encontrar el error?

¡Gracias!

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

0

La condición de si el día está dentro de los límites siempre se cumple para cualquiera de las dos primeras cláusulas o para ambas. Esto significa que toda la expresión es verdadera sin evaluar la tercera cláusula, que es la que podría establecer la fecha en una de las fechas posteriores que falta. Dado que no está ejecutando esa declaración if en un bucle, solo enviará una fecha a la matriz de resultados.

Un algoritmo más generalizado usaría un bucle.

 let current = start.clone(); if (current.day(dia).isSameOrAfter(start) && current.isSameOrBefore(end)) { result.push(current.clone()); } while (current.day(7 + dia).isSameOrAfter(start) && current.isSameOrBefore(end)) { result.push(current.clone()); }

Nota: También cambié la conjunción a && porque con el bucle, isAfter siempre sería verdadero. También omití current.day(dia) en la segunda cláusula ya que la primera ya está configurando el día de la semana actual.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Presiona un día ( result.push(current.clone()) ) exactamente una vez, por lo que no puede esperar tener más de una fecha por día. Puede hacer una segunda declaración if con esta condición: (current.day(7 + dia).isSameOrBefore(end)) y presionarla por segunda vez.

Además, en js, cuando se cumple la primera condición en if , las otras no se resuelven.

 const allDays = [0, 3, 5]; function formatToPush(dt_inicio, dt_final, dia, horas) { let start = moment(dt_inicio); let end = moment(dt_final); let result = []; let datas = []; let current = start.clone(); if ((current.day(dia).isSameOrAfter(start)) || (current.day(dia).isSameOrAfter(end)) || (current.day(7 + dia).isSameOrBefore(end))) { result.push(current.clone()); } if (current.day(7 + dia).isSameOrBefore(end)) { result.push(current.clone()); } result.map(m => { horas.map(h => { m.set({ hour: h.split(':')[0], minute: h.split(':')[1], second: 0, millisecond: 0 }); datas.push(m.format('YYYY-MM-DD HH:mm:ss')) }) }); return datas; } let final = []; for (let i in allDays) { final.push(...formatToPush('2021-12-01', '2021-12-10', allDays[i], ["10:00", "16:00", "22:30"])) } console.log(final)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

about 4 years ago · Juan Pablo Isaza Denunciar

0

Aquí hay una alternativa si desea hacer esto en tres sencillas líneas utilizando la API de fecha.

Ofrezco esta alternativa considerando que momentjs tiene más de 17,000 líneas de código en 42k.

Por tu consideración.

Mientras se procesa el rango de principio a fin (inclusive)

  1. convierta la fecha en una cadena de fechas y busque viernes, domingo o miércoles
  2. si se encuentra -> Agregar la fecha a la matriz de resultados
  3. comprobar la próxima fecha

 const startDate = new Date('2021', '11', '1'); const endDate = new Date('2021', '11', '31'); var tempDate = new Date('2021', '11', '1'); var result = []; while (tempDate.valueOf() !== endDate.valueOf()) { if (/Fri|Sun|Wed/.test(tempDate.toDateString())) result.push(new Date(tempDate)); tempDate.setDate(tempDate.getDate() + 1); } result.forEach(day => console.log(day.toDateString(), day.toISOString().replace("T",' ')));

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