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

Я создал решение, как это:

this.daysBetween = [];
while (dateFrom.getDate() !== dateTo.getDate()+1 ) {
    this.daysBetween.push(this.dateFrom);
    dateFrom.setDate(dateFrom.getDate()+1);
  }

Но это работает только в 90% случаев (если есть изменение месяца, это не работает)

Например когда я выбираю даты:

dateFrom: 29 august
dateTo: 30 august 

Это печатает мне дни от 29 august till 30 september ignoring 31 august ...

Любые идеи, как исправить мое решение, или, может быть, есть лучшее?

РЕДАКТИРОВАТЬ:

Мой вопрос отличается от предложенного, потому что в моем вопросе у меня есть две даты

Например

let dateFrom = new Date(2018, 9, 29);
let dateTo = new Date(2018, 9, 30);

Предполагаемый повторяющийся результат этого мог бы быть int number 1

Мой вопрос - как пройти все дни между двумя датами (dateFrom, dateTo)

Где результат этих двух примеров дат (dateFrom, dateTo) был бы список с 2 элементами:

Mon Oct 29 2018 00:00:00 GMT+0100
Tue Oct 30 2018 00:00:00 GMT+0100 
1
degath 20 Авг 2018 в 11:13

3 ответа

Лучший ответ

Вы можете рассчитать разницу в миллисекундах, а затем преобразовать ее в разницу в днях.

Затем вы можете использовать это, чтобы заполнить массив объектами Date:

const MS_PER_DAY: number = 1000 x 60 x 60 x 24;
const start: number = dateFrom.getTime();
const end: number = dateTo.getTime();
const daysBetweenDates: number = Math.ceil((end - start) / MS_PER_DAY);

// The days array will contain a Date object for each day between dates (inclusive)
const days: Date[] = Array.from(new Array(daysBetweenDates + 1), 
    (v, i) => new Date(start + (i * MS_PER_DAY)));
3
duncanhall 20 Авг 2018 в 09:15

Вы можете использовать длительность момента:

/**
 * Get an array of moment instances, each representing a day beween given timestamps.
 * @param {string|Date} from start date 
 * @param {string|Date} to end date
 */
function daysBetween(from, to) {
  const fromDate = moment(new Date(from)).startOf('day');
  const toDate = moment(new Date(to)).endOf('day');

  const span = moment.duration(toDate.diff(fromDate)).asDays();
  const days = [];
  for (let i = 0; i <= span; i++) {
    days.push(moment(fromDate).add(i, 'day').startOf('day'));
  }
  return days;
}

const days = daysBetween('29-Aug-2018', '30-Sep-2018');

console.info(days.map(d => d.toString()).join('\n'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

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

3
S.D. 20 Авг 2018 в 09:33

Простое решение Typescript приведено ниже

Версия Javascript на Github

    class MyDate {
        dates: Date[];
        constructor() {
            this.dates = [];
        }

        private addDays(currentDate) { 
                let date = new Date(currentDate);
                date.setDate(date.getDate() + 1);
                return date;
        }

        getDates(startDate: Date, endDate: Date) { 
            let currentDate: Date = startDate;
            while (currentDate <= endDate) { 
                this.dates.push(currentDate);
                currentDate = this.addDays(currentDate);
            }

            return this.dates;
        }
    }

    let md = new MyDate();
    let daysBetween: Date[] = md.getDates(new Date(2018, 7, 22), new Date(2018, 8, 30));
    console.log(daysBetween);
4
Rizwan Liaqat 20 Авг 2018 в 17:11
51926579