Момент не возвращается, диапазон дат

Я пытаюсь создать массив дат между двумя датами.

[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>

Пытаясь отладить его, он не ломается или что-то еще, и он возвращает только дату начала и окончания, но не отправляет массив дат. Что я здесь делаю не так?

Кроме того, я просмотрел другие сообщения по этому поводу, и я сам работал с диапазоном дат в прошлом. Однако я не понимаю, почему это не работает для меня.

Любая помощь приветствуется. Спасибо!

здесь есть пара проблем, но логика неверна по отношению к функции dateRange(). Он вызывается как часть оператора присваивания, но ничего не возвращает. Вдобавок функция изменила то, что кажется глобальным. Сначала необходимо это исправить.

Randy Casburn 16.11.2018 16:24

@Durga Мой вопрос не в том, как, а в том, что я делаю неправильно в коде. И я также упомянул об этом в своем вопросе.

ace23 16.11.2018 16:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
153
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

 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 (), которая не является надежен во всех браузерах и версиях "

ace23 16.11.2018 16:37
Ответ принят как подходящий

В вашем коде довольно много недостатков и ошибок, их слишком много, чтобы перечислить их на самом деле. Резюме будет включать ненужное создание, а затем повторное преобразование дат, ненужное использование конструкторов 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 ...» и так далее.

ace23 16.11.2018 17:20

Вы говорите конкретно о датах ближе к концу месяца, где, например, 30-го числа не существует в феврале, поэтому вы получите 28-е число, но в следующий раз оно будет просто 28-го марта, но вы хотели, чтобы оно перешло к 31-му? Или вы утверждаете, что это вообще «не работает»? Пожалуйста, поясните, чего вы на самом деле ожидали. В исходном вопросе вы не указали такие подробности, как это, вы просто сказали, что хотите массив - нам оставалось даже определить основной факт, что это должна быть одна запись в месяц.

ADyson 16.11.2018 17:34

Да, в случае февраля он продлится до 28 числа, а в следующем месяце - до 30 марта (а не 31 числа). Я каждый раз пытаюсь добавить 1 месяц к startDate. Другой пример, если моя startdate = 31/12/2018, тогда мой массив будет [31/12/2018,1/31/2019,2/28/2019,3/31/2019 ....

ace23 16.11.2018 17:39

Хорошо, понятно, спасибо. Я отредактировал ответ - попробуйте еще раз. Демонстрация теперь работает с выходными днями месяца, чтобы вы могли видеть.

ADyson 16.11.2018 17:54

ты про формат вывода? формат ввода уже мм / дд / гггг. Я не понимаю, как формат, который вы выводите, повлияет на список выводимых значений.

ADyson 19.11.2018 23:26

Это не так. Мне просто нужно, чтобы он был в определенном формате, но у меня сработал moment.utc. Я только что понял, что при изменении формата на ("мм / дд / гггг") печатается на 1 день меньше, но еще раз спасибо.

ace23 20.11.2018 15:26

Я до сих пор понятия не имею, что вы имеете в виду под словом «на 1 день меньше» или почему формат чего-либо может изменить такую ​​вещь (форматы - это всего лишь человеческие понятия - момент не хранит ничего в определенном формате внутри), но Я рад, что у вас все заработало так, как вам нужно.

ADyson 20.11.2018 15:38

Если мне нужен диапазон дат, основанный на endDate, как мне это сделать? Предположим, endDate = 17.11.2019 и startDate = 20.11.2018. Диапазон дат = 20.11.2018, 17.12.2019, 17.01.2019 ... 17.11.2019.

ace23 20.11.2018 16:34

Просто измените весь процесс, чтобы начать с конца и работать в обратном направлении. Из головы (непроверено): var now = etDate.clone(); var day = etDate.date(); while(now.isAfter(stDate)) { ... now = now.clone().subtract({ "months" : 1 }); Я уверен, что вам не придется ничего менять. Возможно, тебе придется немного повозиться с вещами на конец месяца, я не знаю. Попробуйте, если вы все еще застряли после этого, пожалуйста, задайте новый вопрос вместо того, чтобы постоянно отказываться от этого - спасибо.

ADyson 20.11.2018 16:46

Другие вопросы по теме