我正在尝试建立固定周数的每周日历。我从开始日期开始,然后按方法循环遍历每一天nextDay.setDate( start.getDate() + num )
直到下个月的第一天之后才能正常工作。然后,而不是每天增加,而是每月增加。
var content = $('.content');
function addZeros(int) {
if (parseInt(int) < 10) {
return "0" + int;
} else {
return int;
}
}
var start = new Date("2017-12-01T00:00:00");
var nextDay = new Date(start);
var d = 0;
var dateStr = "";
for (var w = 1; w <= 8; w++) {
dateStr += "week " + w + "<br>";
for (var i = 0; i < 7; i++) {
var factor = (d * 7),
num = i + factor;
nextDay.setDate( start.getDate() + num );
dateStr += nextDay.getFullYear() + "-" + addZeros( nextDay.getMonth() + 1 ) + "-" + addZeros( nextDay.getDate() ) + "<br>";
content.html(dateStr);
}
d++;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="content"></div>
为什么这样做呢?
最佳答案
Date.prototype.setDate
不是幂等的。一旦开始提供超过日期月份长度的值,它将根据您当前的月份来计算新日期。由于您重复使用了相同的Date对象,因此,每次在31之后调用setDate
时,其跳转的幅度都超出了您的期望。
let date = new Date('2017-12-29T00:00:00');
date.setDate(30); // 2017-12-30
date.setDate(31); // 2017-12-31
date.setDate(32);
// 2018-01-01 (set date to 32 days after "currentMonth 0th": December 0th + 32 = January 1st)
date.setDate(33); // 2018-02-02 (January 0th + 33 = February 2nd)
date.setDate(34); // 2018-03-06 (February 0th + 34 = March 6th)
不要尝试显式设置日期,而是让
nextDay
跟踪其自身的状态。此行代码将nextDay
提前一天:nextDay.setTime(nextDay.getTime() + 86400000); // 86400000 millis in a day
关于javascript - 为什么在程序开始新的月份后月份开始增加?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47603054/