Получить диапазон месяцев, используя момент с начальным месяцем и конечным месяцем - PullRequest
0 голосов
/ 17 октября 2018

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

const from = moment('2018-05-01', 'YYYY-MM-DD').format('MMMM');
  const to = moment('2018-07-01', 'YYYY-MM-DD').format('MMMM');

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

['May', 'June', 'July']

Есть ли способ, которым мы можем достичь этого мгновенно, и какой самый элегантный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

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

var months = moment.months();
console.log(JSON.stringify(months))

console.log(JSON.stringify(months.slice(4,7)))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 18 октября 2018

Просто чтобы показать решение без moment.js.

Названия месяцев доступны на языке браузера по умолчанию, используя toLocaleString .Чтобы получить имена месяцев с 3-го по 5-й месяц включительно, выделите их из массива, например,

/* Return array of month names for month number range in the
 * browser default language.
 * E.g. 3,5 returns ['March','April','May] with default language English
 * Assumes Gregorian calendar, 12 months in year. If input is invalid,
 * returns an empty array
 *
 * @param {number|string} [startMonth=1] - calendar month number
 * @param {number|string} [endMonth=12]  - calendar month number
 * @returns {string[]} Array of month names from startMonth to endMonth inclusive.
 */
var getMonthNames = (function () {
  var months = new Array(12).fill(0).map((v,i)=>
    new Date(2000,i).toLocaleString(undefined,{month:'long'})
  );
  return function(startMonth=1, endMonth=12) {
    return isNaN(+startMonth) || isNaN(+endMonth)? [] :
           months.slice(--startMonth, endMonth);
  }
}());

// Example
[['03', '03'], // Single month
 ['06'],       // Month to end of year
 [],           // Month 1 to 12
 ['01', '09'], // Month 1 to month 9
 ['foo']       // Erroneous input
].forEach(args => 
  console.log(`${args.toString()}: ${getMonthNames(...args).join(', ')}`)
);

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

Требуется лучшая обработка ошибокНапример, отметка start <= end, 0 < start < 13, 0 < end < 13, start и end - целые числа и т. д.

0 голосов
/ 17 октября 2018

Пожалуйста, найдите приведенный ниже формат на данный момент.

var fromDate = moment('2018-05-01','YYYY-MM-DD');
var toDate = moment('2018-07-01','YYYY-MM-DD');
var monthData = [];

while (toDate > fromDate || fromDate.format('M') === toDate.format('M')){

monthData.push(fromDate.format('MMMM'));
fromDate.add(1,'month');

}
console.log(monthData); // Output ["May", "June", "July"]

Спасибо

...