Я пытаюсь создать список дней между двумя днями.
Я создал решение, как это:
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
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)));
Вы можете использовать длительность момента:
/**
* 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>
Вы можете изменить условие начала / окончания цикла, чтобы включить / исключить первый / последний день.
Простое решение Typescript приведено ниже
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);
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.