Получить массив с количеством дней - PullRequest
0 голосов
/ 03 декабря 2018

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

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

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

Что я пытаюсьдостичь:

enter image description here

Что я пробовал:

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>

Массив дат варьируется от 30-30 в первых нескольких столбцах и 30-29 в последних столбцах, кроме високосного года.

Первый случай работает.Как мне сделать диапазон дат с 30 по 29 для второго случая?Я пробовал .subtract (1, 'days'), но он не возвращает правильный результат, потому что я хочу, чтобы диапазон дат тоже работал, вместо того, чтобы просто вычитать день каждый раз.

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

Ответы [ 4 ]

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

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

  while (1 == 1) {
  let nextStart = mstart.clone().add(i, 'M');
  let nextEnd = mstart.clone().add(i + 1, 'M').subtract(1,'days') > mend ? mend : mstart.clone().add(i + 1, 'M').subtract(1,'days') ;
0 голосов
/ 03 декабря 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));

while (mstart.format('MM-DD-YYYY') != mend.format('MM-DD-YYYY')) {
  dates.push(mstart.format('DD'));
  mstart.add(1, 'day');
}

console.log(dates);

Вы можете проверить это здесь: https://jsbin.com/lufupihabe/edit?html,js,console

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

Для достижения ожидаемого результата используйте опцию ниже

  1. Выполните еще одну проверку для проверки даты окончания, если она больше 28
  2. Сложите и вычтите дни на основе этого условия

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 nextEnd

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

  if(nextEnd.date() > 28){
    nextEnd.subtract(1, 'days')
  }else{
   
  }
  console.log("start-->", nextStart.format('MM/DD/YYYY'), "end--", nextEnd.format('MM/DD/YYYY'))

 

  if (nextEnd >= mend) {
    break;
  }else{
     dates.push(nextEnd.diff(nextStart, 'days'));
  }

  i += 1
}


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

codepen - https://codepen.io/nagasai/pen/LXaKKY?editors=1010

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

Просто к вашему сведению в этот момент есть официальный плагин ( он есть в их документации ) в отношении диапазонов, и с ним ваше решение будет выглядеть примерно так:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const range = moment.range(moment(new Date("11/30/2018")), moment(new Date("09/30/2019")));
console.log(Array.from(range.by('day')).map(x => +x.format('DD')))

ВыВы можете изменить формат, в котором хотите получать дни, за последние x.format('') и т. д.

Вы можете увидеть его , работающий здесь

...