卡住在月循环中的日期



日期各为一个月,然后陷入循环。从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!

相关内容

  • 没有找到相关文章

最新更新