vue时间段校验

  • Post author:
  • Post category:vue


/**
 * 返回时间描述
 */
const checkInfo = ([start, end], startTime, endTime, callback, msg) => {
  if (start < startTime) {
    callback(new Error(`开始时间不能小于${msg}开始时间`));
    return true;
  }
  if (start > endTime) {
    callback(new Error(`开始时间不能大于${msg}截至时间`));
    return true;
  }
  if (end > endTime) {
    callback(new Error(`结束时间不能大于${msg}截至时间`));
    return true;
  }
  return false;
}
/**
 * 检验天时间
 * @param that 组件对象
 * @param value 选择时间
 * @param callback 校验回调
 * @returns {boolean}
 */
const checkDayTime = (that, value, callback) => {
  const startTime = that.timeToDate(that.transformDate(new Date()).yyMMdd + ' 00:00:00')
  const endTime = that.timeToDate(that.transformDate(new Date()).yyMMdd + ' 23:59:59');
  return checkInfo(value, startTime, endTime, callback, '本日')
}
/**
 * 检验月时间
 * @param that 组件对象
 * @param value 选择时间
 * @param callback 校验回调
 * @returns {boolean}
 */
const checkWeekTime = (that, value, callback) => {
  const now = new Date();
  const nowTime = now.getTime();
  const day = now.getDay();
  const oneDayTime = 24 * 60 * 60 * 1000;
  // 显示周一
  const mondayTime = nowTime - day * oneDayTime;
  // 显示周日
  const sundayTime = nowTime + (7 - day) * oneDayTime;
  // 初始化日期时间
  const startTime = new Date(mondayTime);
  // 本周结束时间
  const endTime = new Date(sundayTime);
  return checkInfo(value, startTime, endTime, callback, '本周')
}
/**
 * 校验本月合法时间
 * @param that 组件对象
 * @param value 校验数据
 * @param year 本年
 * @param month 本月
 * @param monthDays 每月拥有天数
 * @param callback 数据回调
 * @returns {boolean}
 */
const checkMonthTime = (that, value, year, month, monthDays = [], callback) => {
  const haveDays = monthDays[month];
  // 初始化日期时间
  const startTime = new Date(`${year}/${that.addZorro(month + 1)}/01 00:00:00`);
  const endTime = new Date(`${year}/${that.addZorro(month + 1)}/${haveDays} 23:59:59`);
  return checkInfo(value, startTime, endTime, callback, '本月')
}
/**
 * 校验本季度合法时间
 * @param that 组件对象
 * @param value 校验数据
 * @param year 本年
 * @param month 本月
 * @param monthDays 每月拥有天数
 * @param callback 数据回调
 * @returns {boolean}
 */
const checkQuarterTime = (that, value, year, month, monthDays = [], callback) => {
  // 季度分配总天数
  const quarterList = [
    monthDays[0] + monthDays[1] + monthDays[2],
    monthDays[3] + monthDays[4] + monthDays[5],
    monthDays[6] + monthDays[7] + monthDays[8],
    monthDays[9] + monthDays[10] + monthDays[11],
  ];
  // 季度开始月分
  const quarterStartList = [0, 3, 6, 9];
  // 获取所属季度
  const nowQuarter = parseInt(`${month % 3}`);
  // 初始化日期时间
  const startTime = new Date(`${year}/${that.addZorro(quarterStartList[nowQuarter] + 1)}/01 00:00:00`);
  // 计算结束时间撮
  const timeNum = (startTime.getTime()) + 86400000 * quarterList[nowQuarter];
  const endTime = new Date(timeNum);
  return checkInfo(value, startTime, endTime, callback, '本季度')
}
/**
 * 校验本季度合法时间
 * @param that 组件对象
 * @param value 校验数据
 * @param year 本年
 * @param isLeap 是否为闰年
 * @param callback 数据回调
 * @returns {boolean}
 */
const checkYearTime = (that, value, year, isLeap, callback) => {
  // 初始化日期时间
  const startTime = new Date(`${year}/01/01 00:00:00`);
  // 计算结束时间撮
  const timeNum = (startTime.getTime()) + 86400000 * (isLeap ? 366 : 365);
  // 获取结束时间对象
  const endTime = new Date(timeNum);
  return checkInfo(value, startTime, endTime, callback, '本年')
}
/**
 * 校验时间合法性
 * @param that 当前组件
 * @param value 当前值
 * @param targetType 所需时间类型
 * @param callback 校验回调
 */
export const checkPTime = (that, targetType, value, callback) => {
  const len = (value || []).length;
  if (len) {
    if (value[0] > value[1]) {
      callback(new Error('开始时间应小于结束时间'));
      return;
    }
    // 校验天
    if (targetType === 0 && checkDayTime(that, value, callback)) return;
    // 校验周
    if (targetType === 1 && checkWeekTime(that, value, callback)) return;
    if (that.keInList(targetType, [2, 3, 4])) {
      // 当前时间对象
      const newDate = new Date();
      // 当前年
      const year = newDate.getFullYear();
      // 当前月
      const month = newDate.getFullYear();
      // 是否闰年
      const isLeap = (year % 4 === 0 && !(year % 100 === 0)) || year % 400 === 0;
      // 每年每月天数
      const monthDays = [31, isLeap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
      // 校验月
      if (targetType === 2 && checkMonthTime(that, value, year, month, monthDays, callback)) return;
      // 校验季度
      if (targetType === 3 && checkQuarterTime(that, value, year, month, monthDays, callback)) return;
      // 校验年
      if (targetType === 4 && checkYearTime(that, value, year, isLeap, callback)) return;
    }
    callback();
    return;
  }
  callback(new Error('选择时间周期'))
}



版权声明:本文为zarek_jiamu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。