Массив дней между месяцами

1

У меня две даты: 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);
  • 2
    Что вам нужно в качестве конечного результата, просто плоский массив со всеми датами от начала до конца? Затем я бы просто использовал один цикл, который увеличивает дату на один день в каждой итерации (это можно сделать за пределами месяца с помощью объекта JavaScripts Date, продвижение дня на один в 2018/01/31 автоматически высадит вас в феврале), вместо этого довольно запутанного (и неправильного, не каждый день 1000 * 3600 * 24 секунд, по крайней мере, не в регионах с DST) вычисления в daysBetween
  • 0
    Я чувствую себя идиотом, я написал ответ на C #, а не JS. Извините, я удалил это.
Показать ещё 4 комментария
Теги:

3 ответа

0
Лучший ответ

Для меня работал следующий код. Я добавил 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;
    }
0

я думаю, что это сработает для вас,

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;
}

** Бесстыдно копируется из Интернета, но это отлично работает для меня.

0

Хотя следующее не отвечает на ваш вопрос, это альтернативный подход к общей проблеме, которую вы пытаетесь решить.

Один из подходов - просто получить разницу во времени между двумя датами, а затем разделить на количество микросекунд в день. Как вы заметите, хотя это не точно, и поэтому пол используется для получения дней. Есть и другие проблемы с этим подходом, такие как диапазоны дат до эпохи, но это очень упрощенный подход и может работать в зависимости от ваших потребностей.

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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню