【问题标题】:Why do the months start incrementing after the program begins a new month?为什么程序开始新的一个月后月份开始增加?
【发布时间】:2017-12-01 23:46:12
【问题描述】:

我正在尝试建立一个固定周数的每周日历。我从开始日期开始,并通过该方法循环添加每天的周数

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>

为什么要这样做?

【问题讨论】:

    标签: javascript jquery date datetime


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      如果您使用 UTC 毫秒,则计算起来会更容易,因为您只需将一天中的毫秒数相加,而不必担心一个月中有多少天。然后将其转换回日期,您可以使用.getMonth() 等。

      https://jsfiddle.net/z5vkfkLq/

      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 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;
              var nextDay = new Date(start.getTime() + 86400000*num);
      
          dateStr += nextDay.getFullYear() + "-" + addZeros( nextDay.getMonth() + 1 ) + "-" + addZeros( nextDay.getDate() ) + "<br>";
          content.html(dateStr);
          }
      
        d++;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多