Момент не возвращается диапазон дат - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать массив дат между двумя датами.

[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 голосов
/ 16 ноября 2018

В вашем коде довольно много неэффективностей и ошибок, их слишком много, чтобы перечислять.Сводка будет включать в себя ненужное создание, а затем повторную строковость дат, ненужное использование конструкторов 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>
0 голосов
/ 16 ноября 2018
 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;
};
...