Сравнить диапазон дат с моментом

Я пытаюсь получить следующий вывод:

Вот мой код:

const start = "12/7/2018";
const end = "10/6/2019";

var startLease = moment(start, "MM/DD/YYYY");
var endLease = moment(end, "MM/DD/YYYY");

var array = [];
var i = 0;
var nextEnd;

while (1 == 1) {
  var nextStart = nextEnd ? (nextEnd.date() > 28 ? nextEnd : nextEnd) : nextEnd || startLease.clone().add(i, 'M');
  nextEnd = startLease.clone().add(i + 1, 'M') > endLease ? endLease : startLease.clone().add(i + 1, 'M');
  if (nextEnd.date() > 28) {
    nextEnd.subtract(1, 'days')
  } else {}

  array.push(nextEnd.diff(nextStart, 'days'));

  if (nextEnd >= endLease) {
    break;
  } else {}
  i += 1
}

console.log(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Проблема: вместо того, чтобы идти от 7th-6th это идет от 7th-7th каждого месяца. Я пробовал.subtract(1, 'days'), но это не выдает правильные значения. Тем не менее, это работает на конец месяца.

Любая помощь приветствуется. Спасибо.

2 ответа

Решение

Я добавил некоторые записи в ваш цикл и отключил их после одной итерации.

Только первый месяц не подходит для вашего примера, поэтому вы ожидаете, что если вы добавите 1 месяц к 7 декабря 2018 года, вы получите 6 января 2019 года (на самом деле вы получите 7 января 2019 года).

Я не уверен, что должно делать условие, которое приводит к вычитанию дня. nextEnd.date() будет преобразовываться в день месяца, который для вашего примера всегда меньше 28.

const start = "12/7/2018";
const end = "10/6/2019";

var startLease = moment(start, "MM/DD/YYYY");
var endLease = moment(end, "MM/DD/YYYY");

var array = [];
var i = 0;
var nextEnd;

while (1 == 1) {
  var nextStart = nextEnd ? (nextEnd.date() > 28 ? nextEnd : nextEnd) : nextEnd || startLease.clone().add(i, 'M');
  console.log(nextStart);
  nextEnd = startLease.clone().add(i + 1, 'M') > endLease ? endLease : startLease.clone().add(i + 1, 'M');
  console.log(nextEnd);
  if (nextEnd.date() > 28) {
    nextEnd.subtract(1, 'days')
  } else {}

  array.push(nextEnd.diff(nextStart, 'days'));

  if (nextEnd >= endLease) {
    break;
  } else {}
  i += 1;
  break;
}

console.log(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Это сработало для меня:

              while(1==1){
                var nextStart = nextEnd ? nextEnd : startLease.clone().add(i, 'M');
                var tempstart = startLease.clone();
                tempstart.date(1);
                if (startLease.date() < endLease.date() && array.length == 0) {
                    i = -1;
                }
                tempstart.add(i + 1, 'M');

                var days = [31, 28, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31];
                var year = tempstart.year();
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
                    days[1] = 29;

                if (endLease.date() > days[tempstart.month()]) {
                    tempstart.date(days[tempstart.month()]);
                } else {
                    tempstart.date(endLease.date());
                }

                nextEnd = tempstart > endLease ? endLease : tempstart;

                var diff_sum = nextEnd.diff(nextStart, 'days');

                array.push (diff_sum);

                if (nextEnd >= endLease) {
                    break;
                }
                i += 1
            }
Другие вопросы по тегам