У меня две даты: Startdate и enddate startdate = "10/10/2018" enddate = "03/09/2019"
Я пытаюсь создать массив дат между этими двумя датами. У меня есть следующий код.
function getDateArray (start, end) {
var arr = [];
var startDate = new Date(start);
var endDate = new Date(end);
endDate.setMonth( endDate.getMonth());
while (startDate <= endDate) {
arr.push(new Date(startDate));
startDate.setMonth(startDate.getMonth() + 1);
}
return arr;
}
Затем вычислите количество дней между этими месяцами между ними. 10/10/2018 по 11/10/2018 = 30 дней 11/10/2012 по 12/10/2018 = 30 дней или около того в зависимости от количества дней между двумя датами, а затем создайте массив дат.
[30,30,31.... до окончания]
function daysBetween(date1, date2 )
{
var timeDiff = Math.abs(date2.getTime() - date1.getTime());
var dayDifference = Math.ceil(timeDiff / (1000 * 3600 * 24));
return dayDifference;
}
Я пробовал следующий код, и он возвращал массив числа дат, однако он не был точным. Он продолжает возвращать 32 дня в октябре. Вывод, который он дает прямо сейчас, выглядит следующим образом. Я не уверен, что я делаю неправильно здесь, но похоже, что он пройдет только до февраля и покажет результат.
Любая помощь будет оценена. Спасибо.
Output: [32,30,31,31,28]
var dateArr = getDateArray(z, y);
console.log(dateArr);
var dayCounts = "";
for (var x = 0; x < dateArr.length-1; x++)
{
dayCounts += daysBetween(dateArr[x], dateArr[x+1]);
}
console.log("datearrlength" + dateArr.length);
console.log(dayCounts);
Для меня работал следующий код. Я добавил 1 дополнительный месяц до даты окончания и дал правильный диапазон дат. Кроме того, вместо Math.ceil, я использовал Math.round, и он дает правильный номер даты.
function getDateArray (start, end) {
var arr = [];
var startDate = new Date(start);
var endDate = new Date(end);
endDate.setMonth( endDate.getMonth());
while (startDate <= endDate) {
arr.push(new Date(startDate));
startDate.setMonth(startDate.getMonth() + 1);
}
return arr;
}
я думаю, что это сработает для вас,
Date.prototype.addDay= function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
function getDateBwStartandEnd(sdate, edate) {
var dateArray = new Array();
var currentDate = sdate;
while (currentDate <= edate) {
dateArray.push(new Date (currentDate));
currentDate = currentDate.addDay(1);
}
return dateArray;
}
** Бесстыдно копируется из Интернета, но это отлично работает для меня.
Хотя следующее не отвечает на ваш вопрос, это альтернативный подход к общей проблеме, которую вы пытаетесь решить.
Один из подходов - просто получить разницу во времени между двумя датами, а затем разделить на количество микросекунд в день. Как вы заметите, хотя это не точно, и поэтому пол используется для получения дней. Есть и другие проблемы с этим подходом, такие как диапазоны дат до эпохи, но это очень упрощенный подход и может работать в зависимости от ваших потребностей.
const startDate = '10/10/2018';
const endDate = '03/09/2019';
const start = (new Date(startDate)).valueOf();
const end = (new Date(endDate)).valueOf();
const timeBetween = end - start;
console.log({timeBetween, days: Math.floor(timeBetween/86400000)});
Несколько более надежным является использование счетчика, который увеличивает его, добавляя 1 день к счетчику и дату начала, в то время как дата начала меньше даты окончания. Опять же, есть некоторые проблемы с этим подходом, но это также зависит от ваших потребностей.
const startDate = '10/10/2018';
const endDate = '03/09/2019';
let start = new Date(startDate);
const end = (new Date(endDate)).valueOf();
let daysBetween = 0;
while (start.valueOf() < end) {
daysBetween++;
start.setDate(start.getDate() + 1);
}
console.log(daysBetween);
Наконец, более надежное решение, позволяющее избежать множества проблем при манипулировании и работе с датами, - использовать библиотеку, такую как momentjs. Использование метода difference
будет выглядеть следующим образом.
const start = moment([2018, 10, 10]);
const end = moment([2019, 3, 9]);
console.log(end.diff(start, 'days'));
<script src="/moment.min.js"></script>
daysBetween
…