日期各为一个月,然后陷入循环。从6月开始,它会持续到7月底或5月初,但然后循环回到这些月的结束/开始,而不是继续前进。globalDate是一个React状态定义的const [globalDate, setGlobalDate] = useState(new Date());
代码片段:
//decreasing
const newDate = new Date();
newDate.setDate(globalDate.getDate() - 1);
if (globalDate.getMonth() !== newDate.getMonth()) {
newDate.setMonth(globalDate.getMonth());
}
if (globalDate.getDate() <= 1) {
newDate.setMonth(globalDate.getMonth() - 1);
newDate.setDate(daysInMonth[newDate.getMonth()]);
}
setGlobalDate(newDate);
//increasing
const newDate = new Date();
newDate.setDate(globalDate.getDate() + 1);
if (globalDate.getMonth() !== newDate.getMonth()) {
newDate.setMonth(globalDate.getMonth());
}
if (globalDate.getDate() >= daysInMonth[globalDate.getMonth()]) {
newDate.setMonth(globalDate.getMonth() + 1);
newDate.setDate(1);
}
setGlobalDate(newDate);
全文来源:https://github.com/Westsi/thynkr/blob/master/frontend/web/js/src/Planner.js
执行newDate.setMonth()
时,newDate
的日期是该月的最后一天,而前一个月的天数较少,则出现第一个代码块中的问题(&;减低&;)。因此,例如,当newDate
是5月31日时,此时对setMonth
进行调用。这个电话会把日期调整到4月31日,但这个日期会自动转换为5月1日,因为4月只有30天,所以你就被困在了5月。
为了避免这类问题,只需立即用globalDate
开始,减去或增加一天。这是所有。溢出到下个月/上个月是JavaScript已经自动处理的事情。因此,与其尝试自己做这件事(并遇到麻烦),不如让JavaScript为您做这件事:
减少逻辑:
const newDate = new Date(globalDate); // starting point!
newDate.setDate(globalDate.getDate() - 1); // month overflow happens automatically!
setGlobalDate(newDate); // That's it!
增加逻辑:
const newDate = new Date(globalDate); // starting point!
newDate.setDate(globalDate.getDate() + 1); // month overflow happens automatically!
setGlobalDate(newDate); // That's it!