用moment.js生成指定月份的日历的数据结构

求给个最佳实践, 对moment不熟(api看了一天了,基础的都了解了), 不想走冤枉路, 求给出最终 数据结构 就行, 比如[[26,27,28,1,2,3,4], [], [], ...]

clipboard.png

感谢, 呜哈哈

clipboard.png

阅读 15k
4 个回答

moment.js API里面好像没有看到直接生成日历的方法

  monthDay(date) {
    const daysArr = [[], [], [], [], [], []]; // 6*7的日历数组
    const currentWeekday = moment(date).date(1).weekday(); // 获取当月1日为星期几
    const lastMonthDays = moment(date).subtract(1, 'month').daysInMonth(); // 获取上月天数
    const currentMonthDays = moment(date).daysInMonth(); // 获取当月天数
    const getDay = day => (day <= lastMonthDays ? day : (day <= (lastMonthDays + currentMonthDays)) ? day - lastMonthDays : day - (lastMonthDays + currentMonthDays)); // 日期处理
    for (let i = 0; i < 7; i += 1) {
      let virtualDay = (lastMonthDays - currentWeekday) + i + 1;
      for (let j = 0; j < 6; j += 1) {
        daysArr[j][i] = getDay(virtualDay + (j * 7));
      }
    }
    console.table(daysArr);
  }
  ...
  monthDay(date); //date格式为moment能识别的格式
  ...

大致想法:

  1. 构建一个6*7的数组daysArr
  2. 获取到上月天数、本月天数以及本月一号对应星期几(0表示周一)
  3. 然后计算出daysArr[0][0]对应的日期(上月天数 - 本月一号对应的星期)
  4. 根据daysArr[0][0]计算出daysArr其他元素的值
let result = [...Array(42).keys()].reduce((acc, val) => {
    acc.push(moment().add(val, 'day').format('YYYY/MM/DD'));
    return acc;
}, []);

一维date数组可以思路:

const dates = []
for(let i = 0; i < 42; i+=1) {
  const startDate = moment('2017-05-20').date(1);
  dates[i] = startDate.weekday(i).date();
};
console.log(dates);
新手上路,请多包涵

我获取到的数据好像不是很对,请问到底怎样使用?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题