我有一个函数,当被调用时,它会在输入的日期上增加7天。日期格式为YYYY-MM-DD(即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];
}
出于某种原因,当函数作为repeat(涉及重复事件的React Web应用程序(的一部分被调用时,addWeek函数不会正确地增加一次,而是在其余时间正确地增加。
以下是我最近一次将repeatCount设置为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-07
正如你可能已经注意到的,除了第二次重复,它正确地增加了一周。我用不同的日期对此进行了多次测试,每次都只是第二次迭代的增量不正确。其他一切都很好。
请帮忙。我对这件事失去了理智。
我忘了早些时候添加:addWeek将日期作为字符串输入。
这是一个夏令时问题。JavaScript中的日期本质上是本地的,因此当您使用setDate()
时,它会尝试在新日期上保持一天中的相同时间,以考虑夏令时的变化。但这意味着与UTC时间(toISOString()
转换为UTC时间(相比,一天中的时间将有所不同。在您的示例中,第二个输出中temp
的实际值是2022-03-17T23:00Z
,距离您要查找的日期还有一个小时。但是你的代码去掉了时间元素,所以你最终休息了一天。
不使用setDate()
,而是使用Date构造函数:
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)
}
Phew。Javascript有时很奇怪。由于转换为ISO字符串,日期获取似乎不准确。请尝试返回临时日期对象而不是字符串。然后在添加周数后进行转换。它可能与Object提供的其他值有关。。。