Получить месяцы между двумя датами JavaScript

Проблема

Прежде всего, я собираюсь уточнить, что этот вопрос не является дубликатом Разница в месяцах между двумя датами в javascript или разница в месяцах javascript

Мой вопрос касается именно получения месяцев между двумя датами, а не количества месяцев.

Ожидаемые результаты

Итак, если date1 – 01.11.2022 (мм/дд/гггг), а date2 – 20.02.2023, он должен вывести массив месяцев, включая месяц date1 и date2, например ["November", "December", "January", "February"]. Мне нужно знать, как вернуть фактические месяцы между двумя датами, а не количество месяцев. Может кто-нибудь объяснить, как это сделать?

@ThomasSablik Этот вопрос специфичен для моментов, мой вопрос касается только JavaScript.

XYBOX 03.12.2022 13:35

Логика точно такая же, как и в принятом ответе. Дубликат содержит ответы с momentjs и date-fns, но ту же логику можно использовать с нативными объектами Date.

Thomas Sablik 03.12.2022 14:09
Поведение ключевого слова "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) для оценки ваших знаний,...
2
3
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сообщение, связанное с вопросом, уже является хорошим началом.

Может быть, подумайте о том, как бы вы это сделали, когда хотите записать результаты на лист бумаги.

Когда мы знаем месяц, с которого начинается, как индекс [0...11], мы можем считать оттуда и добавлять названия месяцев из массива:

const xmas = new Date("December 25, 1999 23:15:30");
const summer = new Date("June 21, 2003 23:15:30");

function monthsBetween(dstart, dend) {
    const monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    let result = [];
    let current = dstart.getMonth();
    let end = (dend.getFullYear() - dstart.getFullYear()) * 12 + dend.getMonth();
    for (;current <= end; current += 1) {
        result.push(monthNames[current % 12]);
    }
    return result;
}

console.info(monthsBetween(xmas, summer)); // [December, January, February..., December, January, ...., June (multiple years)
console.info(monthsBetween(xmas, xmas)); // ["December"]

В вашем примере с 01.11.2022 по 20.02.2023 current будет считаться от 10 (ноябрь, индексируется от 0) до 13 (1: февраль, индексируется от 0 + 1 год = разница в 12 месяцев)

Это отличный ответ, большое спасибо! Кроме того, извиняюсь за то, что не включил воспроизводимый пример, поскольку я не на своем основном компьютере с кодом, но должен был задать этот вопрос как можно раньше, но, тем не менее, вы его получили! :D

XYBOX 03.12.2022 13:29

Вы можете перебирать даты от начала до конца, собирая названия месяцев по мере продвижения.

Начало и конец должны быть объектами Date, то, как вы конвертируете их из меток времени, таких как «01.11.2022», является отдельной проблемой и должно быть рассмотрено на предыдущем шаге.

/* Get month names from start date to end date
 * @param {Date} start - date to start from
 * @param {Date} end - date to end at
 * @param {string} lang - language for month names
 * @returns {string[]} month names from start to end inclusive
 */
function getMonthNames(start = new Date(), end = new Date(), lang = 'en') {
  let d = new Date(start.getFullYear(), start.getMonth());
  let months = [];
  while (d <= end) {
    months.push(d.toLocaleString(lang,{month:'long'}));
    d.setMonth(d.getMonth() + 1);
  }
  return months;
}

let start = new Date(2022, 10, 1);  // 01 Nov 2022
let end   = new Date(2023,  1, 20); // 20 Feb 2023 

console.info(getMonthNames(start, end))

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