此刻不返回日期范围

时间:2018-11-16 15:11:13

标签: javascript date momentjs

我正在尝试创建两个日期之间的日期数组。

[11/16/2018, 12/16/2018, 1/16/2019......11/16/2019]

我有以下代码。

function dateRange(stDate, etDate) {
  const dates = [];
  var startDate = moment(new Date(stDate)).format("MM/DD/YYYY");
  var endDate = moment(new Date(etDate)).format("MM/DD/YYYY");

  var now = new Date(startDate);
  while (startDate <= endDate) {

    dates.push(new Date(now));
    now = now.addMonths(1);
  }
  console.log("dateRange " + dates);
}

function RunLedgerAndPV() {
  var stDate = "11/16/2018";
  var etDate = "11/16/2019";
  dateRange(stDate, etDate);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

尝试调试它,它不会中断或发生任何事情,它仅返回开始和结束日期,但不会推送日期数组。我在这里做什么错了?

此外,我还查看了与此相关的其他帖子,并且我自己过去从事日期范围方面的工作。但是,我不知道为什么这对我不起作用。

感谢您的帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

 for (var i=0; now <= endDate; i++) {
     dates.push(new Date(now));
     now = now.addMonths(1);   
 }

您实例化并使用i来使内容无循环。条件now <= endDate绝不受i的值的影响(通常,您递增/递减i直到达到所需的值,如:var i=0; i < 11; i++)我不知道如何运作,我的第一个直觉是它将生成一个循环,直到我们到达那个endDate日期为止。

您似乎正在寻找获取特定范围内所有日期的方法,请尝试以下操作:

var enumerateDaysBetweenDates = function(startDate, endDate) {
   var dates = [];

   var currDate = moment(startDate, 'MM/DD/YYYY');;
   var lastDate =  moment(endDate, 'MM/DD/YYYY');;

   while(currDate.add(1, 'months').diff(lastDate) < 0) {
    console.log(currDate.toDate());
    dates.push(currDate.clone().toDate());
   }

   return dates;
};

答案 1 :(得分:0)

您的代码中有很多低效率和错误,实在太多了。摘要将包括不必要的创建,然后重新对日期进行字符串化,不必要地使用JS Date构造函数以及for循环中的狡猾逻辑。

这是一个仅使用momentJS功能即可正常工作的版本:

function createLedger(stDate, etDate) {

  if (stDate && etDate) {
    var endOfLeaseDate = moment(etDate, "MM/DD/YYYY");
    var startOfLeaseDate = moment(stDate, "MM/DD/YYYY");
    dateRange(startOfLeaseDate, endOfLeaseDate);
  }
}

function dateRange(stDate, etDate) {
  var dates = [];

  var now = stDate.clone();
  var day = stDate.date();

  while(now.isBefore(etDate)) {
    //deal with variable month end days
    var monthEnd = now.clone().endOf("month");
    if (now.date() < day && day <= monthEnd.date()) { now.date(day); }

    dates.push(now.format("YYYY-MM-DD"));
    now = now.clone().add({ "months" : 1 });
  }
  console.log(dates);
}

function RunLedgerAndPV() {
  var stDate = "12/31/2018";
  var etDate = "12/31/2019";
  createLedger(stDate, etDate);
}
RunLedgerAndPV();
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>