Я пытаюсь создать массив дат между двумя датами.
[11/16/2018, 12/16/2018, 1/16/2019......11/16/2019]
У меня есть следующий код.
function dateRange(stDate, etDate) {
const dates = [];
var startDate = moment(new Date(stDate)).format("MM/DD/YYYY");
var endDate = moment(new Date(etDate)).format("MM/DD/YYYY");
var now = new Date(startDate);
while (startDate <= endDate) {
dates.push(new Date(now));
now = now.addMonths(1);
}
console.info("dateRange " + dates);
}
function RunLedgerAndPV() {
var stDate = "11/16/2018";
var etDate = "11/16/2019";
dateRange(stDate, etDate);
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>Пытаясь отладить его, он не ломается или что-то еще, и он возвращает только дату начала и окончания, но не отправляет массив дат. Что я здесь делаю не так?
Кроме того, я просмотрел другие сообщения по этому поводу, и я сам работал с диапазоном дат в прошлом. Однако я не понимаю, почему это не работает для меня.
Любая помощь приветствуется. Спасибо!
@Durga Мой вопрос не в том, как, а в том, что я делаю неправильно в коде. И я также упомянул об этом в своем вопросе.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


for (var i=0; now <= endDate; i++) {
dates.push(new Date(now));
now = now.addMonths(1);
}
вы создаете и используете i, чтобы ничего не пропустить. на условие now <= endDate никоим образом не влияет значение i (обычно вы увеличиваете / уменьшаете i, пока он не достигнет желаемого значения как: var i=0; i < 11; i++) Я не знаю, как это будет работать, мой первый инстинкт состоит в том, что он сгенерирует цикл, который не остановится, пока мы не достигнем этой даты endDate.
Кажется, вы ищете все даты в определенном диапазоне, попробуйте следующее:
var enumerateDaysBetweenDates = function(startDate, endDate) {
var dates = [];
var currDate = moment(startDate, 'MM/DD/YYYY');;
var lastDate = moment(endDate, 'MM/DD/YYYY');;
while(currDate.add(1, 'months').diff(lastDate) < 0) {
console.info(currDate.toDate());
dates.push(currDate.clone().toDate());
}
return dates;
};
да. Это должна была быть дата начала. Я обновил свой код. Ваш 'startOf' не работает и выдает следующую ошибку: "moment.min.js: 1 Предупреждение об устаревании: указанное значение не находится в распознанном формате RFC2822 или ISO. Конструкция момента возвращается к js Date (), которая не является надежен во всех браузерах и версиях "
В вашем коде довольно много недостатков и ошибок, их слишком много, чтобы перечислить их на самом деле. Резюме будет включать ненужное создание, а затем повторное преобразование дат, ненужное использование конструкторов JS Date и хитрую логику в вашем цикле for.
Вот версия, которая будет правильно работать, используя только функцию momentJS:
function createLedger(stDate, etDate) {
if (stDate && etDate) {
var endOfLeaseDate = moment(etDate, "MM/DD/YYYY");
var startOfLeaseDate = moment(stDate, "MM/DD/YYYY");
dateRange(startOfLeaseDate, endOfLeaseDate);
}
}
function dateRange(stDate, etDate) {
var dates = [];
var now = stDate.clone();
var day = stDate.date();
while(now.isBefore(etDate)) {
//deal with variable month end days
var monthEnd = now.clone().endOf("month");
if (now.date() < day && day <= monthEnd.date()) { now.date(day); }
dates.push(now.format("YYYY-MM-DD"));
now = now.clone().add({ "months" : 1 });
}
console.info(dates);
}
function RunLedgerAndPV() {
var stDate = "12/31/2018";
var etDate = "12/31/2019";
createLedger(stDate, etDate);
}
RunLedgerAndPV();<script src = "https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>Я пробовал это, но это не работает. Предположим, что моя startDate - «30.01.2019», затем добавление месяца до endDate должно вернуть «30.01.2019, 28.02.2019, 30.03.2019 ...» и так далее.
Вы говорите конкретно о датах ближе к концу месяца, где, например, 30-го числа не существует в феврале, поэтому вы получите 28-е число, но в следующий раз оно будет просто 28-го марта, но вы хотели, чтобы оно перешло к 31-му? Или вы утверждаете, что это вообще «не работает»? Пожалуйста, поясните, чего вы на самом деле ожидали. В исходном вопросе вы не указали такие подробности, как это, вы просто сказали, что хотите массив - нам оставалось даже определить основной факт, что это должна быть одна запись в месяц.
Да, в случае февраля он продлится до 28 числа, а в следующем месяце - до 30 марта (а не 31 числа). Я каждый раз пытаюсь добавить 1 месяц к startDate. Другой пример, если моя startdate = 31/12/2018, тогда мой массив будет [31/12/2018,1/31/2019,2/28/2019,3/31/2019 ....
Хорошо, понятно, спасибо. Я отредактировал ответ - попробуйте еще раз. Демонстрация теперь работает с выходными днями месяца, чтобы вы могли видеть.
ты про формат вывода? формат ввода уже мм / дд / гггг. Я не понимаю, как формат, который вы выводите, повлияет на список выводимых значений.
Это не так. Мне просто нужно, чтобы он был в определенном формате, но у меня сработал moment.utc. Я только что понял, что при изменении формата на ("мм / дд / гггг") печатается на 1 день меньше, но еще раз спасибо.
Я до сих пор понятия не имею, что вы имеете в виду под словом «на 1 день меньше» или почему формат чего-либо может изменить такую вещь (форматы - это всего лишь человеческие понятия - момент не хранит ничего в определенном формате внутри), но Я рад, что у вас все заработало так, как вам нужно.
Если мне нужен диапазон дат, основанный на endDate, как мне это сделать? Предположим, endDate = 17.11.2019 и startDate = 20.11.2018. Диапазон дат = 20.11.2018, 17.12.2019, 17.01.2019 ... 17.11.2019.
Просто измените весь процесс, чтобы начать с конца и работать в обратном направлении. Из головы (непроверено): var now = etDate.clone(); var day = etDate.date(); while(now.isAfter(stDate)) { ... now = now.clone().subtract({ "months" : 1 }); Я уверен, что вам не придется ничего менять. Возможно, тебе придется немного повозиться с вещами на конец месяца, я не знаю. Попробуйте, если вы все еще застряли после этого, пожалуйста, задайте новый вопрос вместо того, чтобы постоянно отказываться от этого - спасибо.
здесь есть пара проблем, но логика неверна по отношению к функции
dateRange(). Он вызывается как часть оператора присваивания, но ничего не возвращает. Вдобавок функция изменила то, что кажется глобальным. Сначала необходимо это исправить.