Tengo una función que, cuando se llama, agregará 7 días a la fecha ingresada. El formato de la fecha es AAAA-MM-DD (es decir, 2022-03-02)
for(let i = 0; i < repeatCount; i++) { date = addWeek(date); } function addWeek(date) { let temp = new Date(date); //console.log("Old Date: "); //console.log(temp.toISOString().split('T')[0]) //console.log(temp.getDate()); temp.setDate(temp.getDate() + 7); console.log("New Date: "); console.log(temp.toISOString().split('T')[0]) //console.log("returning date"); return temp.toISOString().split('T')[0]; }Por alguna razón, cuando se llama a la función como parte de una repetición (aplicación web React que involucra eventos recurrentes), la función addWeek no se incrementará correctamente una sola vez, pero luego se incrementará correctamente el resto del tiempo.
Aquí está la entrada de mi registro más reciente cuando configuré repeatCount en 5:
Old Date: 2022-03-04 New Date: 2022-03-11 Old Date: 2022-03-11 New Date: 2022-03-17 Old Date: 2022-03-17 New Date: 2022-03-24 Old Date: 2022-03-24 New Date: 2022-03-31 Old Date: 2022-03-31 New Date: 2022-04-07Como probablemente hayas notado, incrementa la semana correctamente con la excepción de la segunda repetición. He probado esto varias veces con diferentes fechas, y cada vez, es solo la segunda iteración la que se incrementa incorrectamente. Todo lo demás funciona bien.
Por favor ayuda. Estoy perdiendo la cabeza por esto.
Olvidé agregar antes: addWeek toma la fecha como una entrada de cadena.
Este es un problema del horario de verano. Las fechas en JavaScript son inherentemente locales, por lo que cuando usa setDate() intenta mantener la misma hora del día en la nueva fecha, teniendo en cuenta los cambios en el horario de verano. Pero eso significa que la hora del día será diferente en comparación con la hora UTC (a la que se convierte toISOString() ). El valor real de la temp en la segunda salida de su ejemplo es 2022-03-17T23:00Z , una hora antes de la fecha que estaba buscando. Pero su código elimina el elemento de tiempo para que termine con un día libre.
En lugar de usar setDate() , use el constructor de fecha:
temp = new Date(temp.getFullYear(), temp.getMonth(), temp.getDate() + 7); var date = new Date('2022-03-02'); const repeatCount = 5; for(let i = 0; i < repeatCount; i++) { date = addWeek(date); } function addWeek(date) { let temp = new Date(date); temp = new Date(temp.getFullYear(), temp.getMonth(), temp.getDate() + 7); console.log("New Date: ", temp); console.log(temp.toISOString().split('T')[0]) //console.log("returning date"); return temp.toISOString().split('T')[0]; }https://jsfiddle.net/4wm1vz9d/1/
function addWeek(date) { date.setDate(date.getDate()+7) } let date = new Date(); console.log(date) for(let i = 0; i < 5; i++) { addWeek(date) console.log(date) }Uf. Javascript es a veces raro. Parece que la fecha es inexacta debido a la conversión a una cadena ISO. Intente devolver el objeto de fecha temporal en lugar de la cadena. Luego conviértalo después de agregar las semanas. Puede tener algo que ver con los otros valores que proporciona el Objeto...