Member 14013562 Ответов: 2

Создайте массив дней между двумя датами


I have 2 dates: StartDate and EndDate

With the help of the following code, i am able to create an array of months between 2 dates. 

Result = [10/09/2018, 11/09/2018, 12/09/2018, 01/09/2019...08/09/2019]

How do i calculate the number of days in each of those months and then create an array. What i am trying to do is calculate the number of days between those months.(depending on number of days)

Oct-Nov - 30 days
Nov-Dec - 31 days
Dec- Jan - 30 days
.
.
.
July- Aug - 30 days 
and so forth (depending on number of days)
and then create an array from that.

array = [30,30,31,30,28....] 

I also have a function that calculates number of days in each month depending on leap year.
 
<pre lang="text"><pre lang="Javascript">
function isLeapYear(year) {
       return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));
   }
   function getDaysInMonth(year, month) {
       return [31, (isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
   }

Любая помощь будет очень признательна. Спасибо.

Что я уже пробовал:

var getDateArray = function(start, end) {
        var arr = [];
        var dt0 = new Date(start);
        var endD = new Date(end);
        while (dt0 <= endD) {
            arr.push(new Date(dt0));
            dt0.setMonth(dt0.getMonth() + 1);
            }
        return arr;
    }
    
       

     var z = "10/09/2018"; var y = "08/08/2019"
     var dateArr = getDateArray(z, y);

2 Ответов

Рейтинг:
1

raddevus

Как насчет этого?

function getDateArray (start, end) {
        var arr = [];
        var startDate = new Date(start);
        var endDate = new Date(end);
        while (startDate <= endDate) {
            arr.push(new Date(startDate.setMonth(startDate.getMonth() + 1)));
            }
        return arr;
    }
    
function test  (){   

     var z = "2018-09-01"; var y = "2019-09-10"
     var dateArr = getDateArray(z, y);
     alert(dateArr[0] + "\n" + dateArr[1] + "\n" + dateArr[2]);
}


Я изменил ваши dt0 и endD на startDate и endDate.
Кроме того, цикл while немного проще, и он, кажется, работает.

Вы можете видеть, как он работает на:
JS Bin - совместная отладка JavaScript[^]

Он выскакивает первые три даты в массиве, чтобы показать, что он работает.
Выглядит как:
https://i.stack.imgur.com/n2nn3.png[^]

После этого я добавил функцию daysBetween() :
function daysBetween ( date1, date2 ) 
{   
  var timeDiff = Math.abs(date2.getTime() - date1.getTime());
 return dayDifference = Math.ceil(timeDiff / (1000 * 3600 * 24)); 
 }


Затем я заставляю метод test() вызывать и это тоже на двух датах.
alert(daysBetween(dateArr[0], dateArr[3]))

Попробуйте это в jsbin.

Вот увидишь :
https://i.stack.imgur.com/awk1Q.png[^]

Окончательный Код
function calculateFinalArray(dateArr){
  var dayCounts = "";
   for (var x = 0; x < dateArr.length-1;x++)
     {
       dayCounts += daysBetween(dateArr[x],dateArr[x+1]) + ":";
     }
  alert(dayCounts);
}


Выглядит это так: (список с разделителями точек с запятой можно изменить):
https://i.stack.imgur.com/tSm0H.png[^]


Member 14013562

Спасибо, что ответили. Я думаю, вы неправильно поняли мой вопрос. Я уже создаю массив дат. Я пытаюсь найти количество дней между каждым из этих месяцев. Допустим, есть 30 дней между октябрем и ноябрем, 30 дней между ноябрем и декабрем и так далее. Мне нужно создать массив с количеством дней. Пример: [30,30,31...и так далее]

raddevus

я обновил код, доп.. Попытался сделать это до комментария, но опоздал. :)

Member 14013562

Да. Но это будет только общее количество дней между датой начала и датой окончания. То, что я хочу показать, - это то, как мы получаем эту сумму. Поэтому вместо того, чтобы делать в общей сложности 93 дня, мне нужен массив с датами между каждым из этих месяцев. [31,30,31 и так далее].
У меня есть функция, которая вычисляет это. Я только что отредактировал свой код. Не знаю, как это использовать с этим кодом.

raddevus

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

Member 14013562

Это сработало. Большое вам спасибо! :)
Когда я пытаюсь вычислить дни между 10/8/2018 и 11/8/2019, он говорит 0. Кроме того, массив каждый раз сокращается на 1 счет. Почему он это делает?

Рейтинг:
0

Richard MacCutchan

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

function myFunction() {
    var startValue = new Date(2018,9,9,0,0,0,0);
    var endValue = new Date(2018,10,9,0,0,0,0);
    var days = (endValue - startValue) / (1000 * 60 * 60 * 24);
}

Обратите внимание, что месяцы находятся в диапазоне от 0 до 11, а не от 1 до 12. Таким образом, вышеизложенное вычисляет количество дней между 9 октября и 9 ноября.