javascript - 为什么在计划开始新的一个月后月份开始增加?

标签 javascript jquery date datetime

我正在尝试为设定的周数构建周历。我从开始日期开始,循环遍历几周,通过方法添加每天

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/

相关文章:

python - Python 日期和时间增量减法的惊人行为

javascript - 动画在 FF 和 IE 上卡住,但在 Chrome 上不会

javascript - 使 Div 从特定位置展开到 View 中

javascript - 带有 ng-repeat 的 Angular JS 指令无法遍历子元素

javascript - 如果数组元素以某​​个字母开头,则执行某些操作

java - 解析并检索日期时间的时区偏移量

java - new Date(long) 给出不同的结果

javascript - jquery/jscript 未加载

javascript - Phonegap PushNotification,如何将我的 Node 推送服务器与phonegap一起使用?

javascript - 如何在 HTML 的 head 元素内有条件地呈现 CSS 和 JavaScript