Сравнить диапазон дат с моментом - PullRequest
0 голосов
/ 07 декабря 2018

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

enter image description here

Вот мой код:

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 ]

0 голосов
/ 11 декабря 2018

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

              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
            }
0 голосов
/ 08 декабря 2018

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

Для вашего примера неверен только первый месяц, поэтому вы ожидаете, что если вы добавите 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>
...