用JavaScript打印30个日期

时间:2018-02-08 10:11:19

标签: javascript datetime

目标:   在javascript中使用"\n"打印日期2018-01-09至2018-02-08。

问题:   在i = 24之后,日期在"\r\n"中添加月份,不知道为什么。

演示:

date function

感谢任何帮助。

7 个答案:

答案 0 :(得分:2)

根据setDatehttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate)的文档,当传递给setDate的值超过当月的日期时,日期会更新为好月份。< / p>

所以,你不应该增加一个递增的值,但你应该像这样增加一天的数字(&#34;逐个&#34;):

&#13;
&#13;
var date = new Date('2018-01-09');
console.log('date', date);
for (var i = 0; i < 30; i++) {
  console.log('->', i);
  date.setDate(date.getDate() + 1);
  console.log('date', date);
  
  trueDate = date.toISOString().substr(0, 10);
  console.log(trueDate);
 }
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您每次可以在日期中添加1000*60*60*24毫秒:

var date = new Date('2018-01-09');
console.log('date', date);
for (var i = 0; i < 30; i++) {
  console.log(new Date(+date + (1000 * 60 * 60 * 24) * (i+1)));
}

答案 2 :(得分:1)

它正在添加月份,因为您在date22中设置了date11.getDate()+ i。由于date11.getDate()为9而i为24,因此总数变为33,大于该月的天数。这就是它增加月份字段的原因。 你的逻辑应如下:

var date22 = new Date('2018-01-09');
for (var i = 0; i < 30; i++) {
  console.log('->', i);
  date22.setDate(date22.getDate() + 1);
  console.log('date22', date22);

  trueDate = date22.toISOString().substr(0, 10);
  console.log(trueDate);
}

答案 3 :(得分:1)

我不建议使用字符串操作来执行Date计算。字符串操作会对数据的一致性承担全部责任(例如跟踪月中的日期,夏令时等)。

我建议在Date个对象中使用内部毫秒计数器,并尽可能使用Date方法构建迭代。

以下是查找两个已知日期之间所有日期的示例:

var getDatesBetween = (function() {
  //Milliseconds in a day
  var day = 86400000;
  return function getDatesBetween(fromDate, toDate) {
    //Check for invalid parameters
    if (fromDate === void 0 ? true : fromDate instanceof Date === false ||
      toDate === void 0 ? true : toDate instanceof Date === false) {
      //Log an error
      console.error("Invalid parameters");
      //Return and empty list
      return [];
    }
    //Create local date variables to leave original pristine
    //We always put the smallest Date in "from" for consistency
    var from = new Date((fromDate.getTime() < toDate.getTime() ? fromDate : toDate).getTime());
    var to = new Date((fromDate.getTime() < toDate.getTime() ? toDate : fromDate).getTime());
    //Set all data below day to a standardized level
    from.setHours(12, 0, 0, 0);
    to.setHours(12, 0, 0, 0);
    //Return array
    var returner = [];
    //Offset "from" until it is greater than "to"
    while (from.setTime(from.getTime() + day) && from.getTime() < to.getTime()) {
      //Add this day to the return array
      returner.push(new Date(from.getTime()));
    }
    //Return results
    return returner;
  };
})();
//TEST (with mapping example)
var from = new Date("2018-01-09");
var to = new Date("2018-02-08");
console.log({
  from: from.toDateString(),
  'datesBetween': getDatesBetween(from, to)
    .map(function(date) {
      return date.toDateString();
    }),
  to: to.toDateString()
});

答案 4 :(得分:0)

这一天正在进入下个月。以下是正在发生的事情的简单版本:

var d = new Date('2018-01-31'); // last day in January
d.setDate(32); // set date to: d.getDate() + 1 which equals 32
console.log(d); // 2018-02-01T00:00:00.000Z or 1st Feb

答案 5 :(得分:0)

你可以使用以下功能进入一个阵列

var date11 = new Date('2018-01-09');
var date22 = new Date('2018-02-08');

 function getDates(d1, d2) {
 var oneDay = 24 * 3600 * 1000;
 for (var d = [], ms = d1 * 1, last = d2 * 1; ms < last; ms += 
  oneDay) 
    {
    d.push(new Date(ms).toISOString().substr(0, 10));
    }
     return d;
  }
 getDates( date11, date22 )

答案 6 :(得分:0)

问题在于,对于循环的每次迭代,您都会直接改变date22的状态。因此,您将对每个后续循环产生累积影响,因此遇到了溢出本月天数的问题(正如其他海报所指出的那样)。

var date11 = new Date('2018-01-09');
console.log('date11', date11);

for (var i = 0; i < 30; i++) {
 console.log('->', i);
 var dateToPrint = new Date(date11.getTime());
 dateToPrint.setDate(dateToPrint.getDate() + i);

 var trueDate = dateToPrint.toISOString().substr(0, 10);
 console.log(trueDate);
}

上述解决方案使用在每个循环上重新创建的日期变量。这样,每个循环都不会产生副作用。