Массив с количеством дней, используя момент - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь создать массив с количеством дней между двумя датами.

Даты могут быть любыми, но я использую следующее для этого примера.

Start : 11/30/2018, End: 09/30/2019
Array= [30,31,29,30....31]

Что я пытаюсь сделать:

enter image description here

Здесь дата варьируется от 30 to 30 до 30-29.

У меня есть следующий код:

const start = "11/30/2018";
const end = "09/30/2019";

const dates = [];

const mstart = moment(new Date(start));
const mend = moment(new Date(end));

for (let i = 0; mstart < mend ; i++) {

    const daysInMonth = mstart.daysInMonth() + (i === 0 ? -1 : -1);
                      //mstart.daysInMonth() + (i === 0 ? -1 : 0) for the first case.

    dates.push(daysInMonth);

    mstart.add(1, 'M');
}

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

Проблема:

Диапазон дат работает для других дат, если это не конец месяца.

Мне нужен диапазон дат, чтобы перейти от даты начала до даты окончания.Здесь он вычисляет дату с 30 по 29, но как только он переходит в февраль, он занимает 28-е число этого месяца, а затем начинает диапазон дат оттуда.

Как это исправить?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Я бы сравнил даты напрямую, а не по количеству дней в месяце.Также добавлен в проверку, чтобы убедиться, что вы правильно записали свою конечную дату, если это не один и тот же день для начала и конца

const start = "11/30/2018";
const end = "09/30/2019";

const dates = [];

const mstart = moment(new Date(start));
const mend = moment(new Date(end));

let i = 0;
while (1 == 1) {
  let nextStart = mstart.clone().add(i, 'M');
  let nextEnd = mstart.clone().add(i + 1, 'M') > mend ? mend : mstart.clone().add(i + 1, 'M');

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

  if (nextEnd >= mend) {
    break;
  }

  i += 1
}


console.log(dates);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 30 ноября 2018

Вы можете перебрать дни между startDate и endDate и использовать moment, чтобы взять следующий день, а затем извлечь день месяца с помощью moment (date) .date () ...
Делайте это, пока не дойдете до конца.

Обновление: добавить фрагмент:

// Returns all month days.
function getDays(start, end) {
    const days = [];
    start = moment(new Date(start));
    end = moment(new Date(end));
    while (start <= end) {
        days.push(moment(start).date())
        start = moment(start).add(1, 'days');
    }
    return days;
}

// Returns the number of month days.
function getMonthDays(start, end) {
    const days = [];
    start = moment(new Date(start));
    end = moment(new Date(end));
    while (start <= end) {
        days.push(moment(start).daysInMonth())
        start = moment(start).add(1, 'M');
    }
    return days;
}
    
// console.log(getDays("11/30/2018", "09/30/2019"));
console.log(getMonthDays("11/30/2018", "09/30/2019"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
...