开发中或是echart图表轴数据计算时可以使用moment获取某个时间段之间的多少年,月,季度列表,希望这样传入:


console.log(getRangeTimeByUnit(["2015-08","2020-09"], "month"));

console.log(getRangeTimeByUnit(["2017","2019"], "year"));

console.log(getRangeTimeByUnit(["2015-09","2020-05"], "quarter"));

传入2个时间点区间,并带入单位,可以得到期间所有对应单位时间点数组:

输出
[
  '2015-08', '2015-09', '2015-10', '2015-11',
  '2015-12', '2016-01', '2016-02', '2016-03',
  '2016-04', '2016-05', '2016-06', '2016-07',
  '2016-08', '2016-09', '2016-10', '2016-11',
  '2016-12', '2017-01', '2017-02', '2017-03',
  '2017-04', '2017-05', '2017-06', '2017-07',
  '2017-08', '2017-09', '2017-10', '2017-11',
  '2017-12', '2018-01', '2018-02', '2018-03',
  '2018-04', '2018-05', '2018-06', '2018-07',
  '2018-08', '2018-09', '2018-10', '2018-11',
  '2018-12', '2019-01', '2019-02', '2019-03',
  '2019-04', '2019-05', '2019-06', '2019-07',
  '2019-08', '2019-09', '2019-10', '2019-11',
  '2019-12', '2020-01', '2020-02', '2020-03',
  '2020-04', '2020-05', '2020-06', '2020-07',
  '2020-08', '2020-09'
]

输出
[ '2017', '2018', '2019' ]

输出
[
  '2015年3季度', '2015年4季度',
  '2016年1季度', '2016年2季度',
  '2016年3季度', '2016年4季度',
  '2017年1季度', '2017年2季度',
  '2017年3季度', '2017年4季度',
  '2018年1季度', '2018年2季度',
  '2018年3季度', '2018年4季度',
  '2019年1季度', '2019年2季度',
  '2019年3季度', '2019年4季度',
  '2020年1季度', '2020年2季度'
]

实现:

import moment, { Moment } from 'moment';

/**
 * getRangeTimeByUnit 根据时间段和单位获取时间段之间包括时间点本身的所有时间点
 * @param range [Moment, Moment]
 * @param unit 月 季度 年
 * @returns time
 */
export const getRangeTimeByUnit: (
    range: [Moment, Moment],
    timeUnit: 'month' | 'quarter' | 'year'
) => string[] = (range, timeUnit = 'month') => {
    const start = moment(range[0]);
    const end = moment(range[1]);
    if (timeUnit === 'year') {
        const arr = [start.format('YYYY')];
        const diff = moment(end.format('YYYY')).diff(moment(start).format('YYYY'), 'year'); //需要转为年格式再进行diff
        for (let i = 1; i <= diff; i++) {
            arr.push(start.add(1, 'year').format('YYYY'));
        }
        return arr;
    }
    if (timeUnit === 'month') {
        const arr = [start.format('YYYY-MM')];
        const diff = moment(end.format('YYYY-MM')).diff(moment(start).format('YYYY-MM'), 'month');//需要转为年月格式再进行diff
        for (let i = 1; i <= diff; i++) {
            arr.push(start.add(1, 'month').format('YYYY-MM'));
        }
        return arr;
    }
    if (timeUnit === 'quarter') {
        const arr = [start.format('YYYY年Q季度')];
        const diff = moment(end.startOf('quarter')).diff(moment(start).startOf('quarter'), 'quarter');
        for (let i = 1; i <= diff; i++) {
            arr.push(start.add(1, 'quarter').format('YYYY年Q季度'));
        }
        return arr;
    }
    return [];
};

洛阳醉长安行
57 声望3 粉丝

charging...