• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

318
Views
¿Por qué Date.getDate() .setDate() de Javascript se comporta de manera tan impredecible?

Codificador aficionado aquí, y este problema está por encima de mi nivel de pago. Estoy tratando de crear un calendario html/css dinámico, donde las celdas se completan según la fecha de hoy. Obtengo la fecha de hoy y luego trato de agregar días para completar otros 13 días (bucle a través de html elements.innerHTML).

Si trato de establecer Fecha (30 + 2) y luego obtener Fecha (). El código funciona bien. Javascript se da cuenta de que junio termina en el día 30, y el resultado es 2 como se desea (2 de julio)

Pero esto solo funciona si solo hay una llamada, si tengo un bucle o llamo a este código varias veces, entonces el resultado es diferente. ¿Hay algunas cosas asincrónicas que entorpecen el trabajo? Aquí está el código: si deja la llamada "result2" y comenta los demás, funciona muy bien, pero varias llamadas, las cosas se rompen y los números se repiten. ¡Por favor ayuda!

 const theDate = new Date(); const todaysDate = 30; theDate.setDate(todaysDate + 1); let result1 = theDate.getDate(); theDate.setDate(todaysDate + 2); let result2 = theDate.getDate(); theDate.setDate(todaysDate + 3); let result3 = theDate.getDate(); theDate.setDate(todaysDate + 4); let result4 = theDate.getDate(); console.log(result1); console.log(result2); console.log(result3); console.log(result4);

almost 3 years ago · Juan Pablo Isaza
3 answers
Answer question

0

junio tiene 30 días pero julio tiene 31 días.

Cuando configura la fecha en 32 por primera vez, la configura para el 32 de junio y las fechas posteriores al 30 de junio la empujan al 2 de julio. (32-30=2)

Cuando configura 32 nuevamente, ya es julio, por lo que las fechas posteriores al 31 de julio lo empujan al 1 de agosto (32-31 = 1).

almost 3 years ago · Juan Pablo Isaza Report

0

En respuesta a su pregunta, la función setDate() se está comportando de manera extraña porque cada vez que configura la fecha, la configura en relación con la configuración anterior, por lo que aumenta cada vez en 31, 32 o 33 días en lugar de en 1, 2 o 3. Consulte la brillante respuesta de @Quentin para obtener más información, este hallazgo fue completamente suyo y solo quería mencionar la causa raíz en mi respuesta, así como mi propia solución a su problema.


Una solución alternativa si solo desea generar las fechas:

 const dayOfMonth = 30; const date = new Date(); date.setDate(dayOfMonth); console.log("Date:", date); let timestamp = Date.parse(date); for (let i = 1; i <= 14; i++) { const newTimestamp = timestamp + i * (1000 * 60 * 60 * 24); const newDate = new Date(newTimestamp); console.log("New date:", newDate); }

Este método manipulará la marca de tiempo y generará nuevas fechas para cada una de las marcas de tiempo agregadas a la cantidad de milisegundos en un día.

Puede usar su lógica de fecha dentro del bucle para completar el calendario como mencionó.

almost 3 years ago · Juan Pablo Isaza Report

0

Si usa el constructor Date() en cada iteración, no tiene que preocuparse por los días variables de un mes en particular.

Los detalles se comentan en el ejemplo.

 /** * @desc - return a range of dates starting today (or a given * date) and a given number of days (including start) * @param {number} range - The number of days * @param {string<date>} start - The date to start the range * if not defined @default is today * @return {array<date>} An array of dates */ function dayRange(range, start) { // If undefined default is today let now = start ? new Date(start) : new Date(); // Create an array of empty slots - .length === range let rng = [...new Array(range)]; /* .map() through array rng If it's the first iteration add today's date... ... otherwise get tommorow's date... and return it in local format */ return rng.map((_, i) => { if (i === 0) { return now.toLocaleDateString(); } let day = now.getDate() + 1; now.setDate(day); return now.toLocaleDateString(); }); } console.log("Pass the first parameter if the start day is today"); console.log(JSON.stringify(dayRange(14))); console.log("Pass a properly formatted date string as the second parameter if you want to start on a date other than today"); console.log(JSON.stringify(dayRange(10, '05/12/2020')));

almost 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error