手撸日历代码

只为记录获取日历的函数,在插件不适合具体项目时手写日历

export interface ICalendar{
  mealCalendarState?: string;
  day: string | number;
  active: boolean;
  currentMonth: boolean;
  formData: string | number;
  week?: string | number;
  year?: string | number;
  month?: string | number;
  allDays?: string | number;
  isCatering?: boolean;
  formDataMD?:string;
  prev?:boolean
}

/**
 * @description 获取当前时间函数
 */

export const currenTime: ()=> number[] = () => {
  const date = new Date();
  const y = Number(date.getFullYear());
  const m = Number(date.getMonth() + 1);  // 月份小于10时,拼接上0,否则接口无返回数据
  const d = Number(date.getDate());
  return [y,m,d];
  // return `${y}-${m}-${d}`;
}
export  const weekList = ['日', '一', '二', '三', '四', '五', '六']
export const week = [ '一', '二', '三', '四', '五', '六','日'];
export const months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
/**
 * @description 是否是当月
 */
export const isCurrentDay: (y, m) => (number) = (y, m) =>{
  const currentDate = currenTime();
  if(currentDate[0] === y && currentDate[1] === m) return currentDate[2]
  else return 0
}
export const isLeapYear: (y: number)=>boolean = (y) =>{
  const cond1 = y % 4 == 0; //条件1:年份必须要能被4整除
  const cond2 = y % 100 != 0; //条件2:年份不能是整百数
  const cond3 = y % 400 == 0; //条件3:年份是400的倍数
  //当条件1和条件2同时成立时,就肯定是闰年,所以条件1和条件2之间为“与”的关系。
  //如果条件1和条件2不能同时成立,但如果条件3能成立,则仍然是闰年。所以条件3与前2项为“或”的关系。
  //所以得出判断闰年的表达式:
  return (cond1 && cond2) || cond3;
}
/**
 * @description 获取日历
 * @param {String,Number} y 年
 * @param {String,Number} m 月
 */
export const getCalendar:(y: number,m: number)=>ICalendar[] =(y, m) => {
  let fd;
// 求解cy年cm月cd日是星期几,parseInt代表取整 d=1是去每个月第一天
  let cc = parseInt(String(y / 100)); //c
  let cy = y - cc * 100; //y
  let cm = m; //m
  const cd = 1; //d
  // 某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算
  if (m == 1 || m == 2) {
    cc = parseInt(String((y - 1) / 100));
    cy = y - 1 - cc * 100;
    cm = 12 + m;
  }
  //w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
  // var csum = y + [y / 4] + [c / 4] - 2c+[26(m + 1)/10]+d-1;
  const csum = cy + parseInt(String(cy / 4)) + parseInt(String(cc / 4)) - 2 * cc + parseInt(String((26 * (cm + 1)) / 10)) + cd - 1;
  // 注意使用蔡勒公式时出现负数情况    fd 每月第一天星期几
  if (csum < 0) {
    fd = parseInt(String(((csum % 7) + 7) % 7));
  } else {
    fd = parseInt(String(csum % 7));
  }
  // 上个月天数
  const cond = isLeapYear(y)
  //判断当月有多少天
  let allDays = months[m - 1];
  if (cond && m == 2) {
    allDays = 29;
  }
  //上个月是不是去年
  let prevYear = y;
  let prevMonth = m - 1;
  if (m == 1) {
    prevYear = y - 1;
    prevMonth = 12;
  }
  let _prevMonth = prevMonth > 9 ? prevMonth : '0' + prevMonth;
  let _m = m > 9 ? m : '0' + m;
  //判断上个月天数  这里需要判断是不是闰年
  let prevDays = months[prevMonth - 1];
  if(prevMonth === 2 && cond)  prevDays = 29;
  const calendar: ICalendar[] = [];
  //这里塞入上个月末尾日期
  //day 日  active 是否选择 currentMonth 是不是这个月 formData 日期格式


  // fdd代表周日放在星期最后一天   若周日放在第一天删除fdd变量使用fdd的地方改为fd即可(同时定义的week数组也需要调整)


  const fdd = fd - 1 >= 0 ? fd-1 : fd+6;
  for (let i = 1; i <= fdd; i++) {
    let prevDay = prevDays - fdd + i;
    let _prevDay = prevDay > 9 ? prevDay : '0' + prevDay;
    const w = weekList[new Date(prevYear + '-' + _prevMonth + '-' + _prevDay).getDay() ]
    calendar.push({
      day: prevDay,
      active: false,
      currentMonth: false,
      formData: prevYear + '-' + _prevMonth + '-' + _prevDay,
      week:w,
      formDataMD:_prevMonth + '-' + _prevDay,
      prev:true
    });
  }
  //这里塞入正常这个月的日期

  for (let i = 1; i <= allDays; i++) {
    let _i = i > 9 ? i : '0' + i;
    calendar.push({
      day: i,
      active: isCurrentDay(y, m) === i,
      currentMonth: true,
      formData: y + '-' + _m + '-' + _i,
      week: week[((i + fdd - 1) % 7) % 7],
      year: y,
      month: m,
      allDays: allDays,
      isCatering: ((i + fdd - 1) % 7) % 7 < 5,
      formDataMD:  _m + '-' + _i
    });
  }
  //下个月是不是下一年
  let nextYear = y;
  let nextMonth = m + 1;
  if (m == 12) {
    nextYear = y + 1;
    nextMonth = 1;
  }
  let _nextMonth = nextMonth > 9 ? nextMonth : '0' + nextMonth;
  //判断数组最后一排剩余几个位置塞入下个月日期
  let takedie = calendar.length % 7;
  if (7 - takedie > 0 && 7 - takedie < 7) {
    for (let i = 1; i <= 7 - takedie; i++) {
      let _i = i > 9 ? i : '0' + i;
      const w = weekList[new Date(nextYear + '-' + _nextMonth + '-' + _i).getDay() ]
      calendar.push({
        day: i,
        active: false,
        currentMonth: false,
        formData: nextYear + '-' + _nextMonth + '-' + _i,
        week: w,
        formDataMD:  _nextMonth + '-' + _i
      });
    }
  }
  return calendar;
}
/**
 * @description 上年今月
 */
export const prevYear = (currentDate)=> {
  return {
    data:[currentDate[0] - 1, currentDate[1]],
    calendar:getCalendar(currentDate[0] - 1, currentDate[1])
  }
}
/**
 * @description 下年今月
 */
export const nextYear = (currentDate) => {
  return {
    data:[Number(currentDate[0]) + 1, Number(currentDate[1])],
    calendar:getCalendar(Number(currentDate[0]) + 1, Number(currentDate[1]))
  }
}
/**
 * @description 上月
 */
export const prevMonth = (currentDate) => {
  let data: number[];
  if (currentDate[1] - 1 == 0) {
    data = [currentDate[0] - 1, 12];
  } else {
    data = [currentDate[0], currentDate[1] - 1];
  }
  return {
    data,
    calendar:getCalendar(data[0], data[1])
  };
}
/**
 * @description 下月
 */
export const nextMonth = (currentDate) => {
  let data: number[];
  if (currentDate[1] == 12) {
    data = [Number(currentDate[0]) + 1, 1];
  } else {
    data = [Number(currentDate[0]), Number(currentDate[1]) + 1];
  }
  return {
    data,
    calendar:getCalendar(data[0], data[1])
  };
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值