欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

el_elementUI中DatePicker 日期选择器使用时间限制

程序员文章站 2022-06-07 10:45:31
...

限制一年和一年之前

因为业务要求,是按照月份导历史,所以我的查询条件是从 2020-05-18一直追到2019年五月一号

<template>
    <!--vue 时间选择控件测试-->
    <div class="hello">
        <div>
            选中的日期:{{startDate}}{{endDate}}
        </div>
        <div>
            时间范围:
            <el-radio
                    v-model="historyFlag"
                    @change="changeHistory"
                    label="D"
            >
                近一年</el-radio
            >
            <el-radio
                    v-model="historyFlag"
                    @change="changeHistory"
                    label="H"
            >
                历史</el-radio
            >
        </div>
        <div
        >
            <div >
                操作时间:<el-date-picker
                    v-model="dataPickerData.datePickerSpace"
                    type="daterange"
                    unlink-panels
                    :default-value="dataPickerData.limitDatePickerSpace"
                    value-format="yyyy-MM-dd"
                    range-separator="至"
                    start-placeholder="
               开始日期
              "
                    end-placeholder="结束日期"
                    :picker-options="
                historyFlag === 'D'
                  ? dataPickerData.limitCurrentTime
                  : dataPickerData.limitHistoryTime
              "
            >
            </el-date-picker>
            </div>
        </div>
    </div>
</template>

<script>
export default {
  name: 'DatePickerDemo',
  data () {
    return {
      startDate: "",
      endDate: "",
      // 历史选择变量
      historyFlag: "D",
      // 为了区分点击时候没有查询就导出,导致导出历史记录混乱的三方变量
      isSearchHistory: "D",
      dataPickerData: {
        // 日期时间选择数组【开始时间,结束时间】
        datePickerSpace: null,
        // 日期选择数组空间可选范围控制
        limitDatePickerSpace: null,
        limitCurrentTime: {
          /**
           * 限制选择近1年的日期(去年的本月1日到今天)
           * @param time
           * @returns {boolean}
           */
          disabledDate: function(time) {
            // 不能超过当前时间
            if (new Date(time).getTime() > new Date().getTime()) {
              return time.getTime() >= new Date().getTime(); //时间范围必须是时间戳
            } else {
              // 因为项目要求是查找2019-04-01 到 2020-04-25(2020四月的一天)
              // 需要找出现在 2020-04-25 到 2019-04-01有多少天
              // 1.判断年,平年还是闰年
              let y = new Date().getFullYear() - 1;
              // 用年份除以4,如果没有余数就是闰年,如果有余数就是平年。
              let isLeap = (0 === y % 4 && 0 === y % 100) || 0 === y % 400;
              // 平年的2月是28天,闰年是的2月是29天 因此闰年比平年多一天
              // 2019 是 365天
              let days = isLeap ? 366 : 365;
              // getDate 获取现在月份的天数,因为是从0开始,所以,实际日期要比获取到的多一
              // 现在2020-04-25 所以这个月已经过了25天
              let monthDayNum = new Date().getDate() + 1;
              // 计算天数 一天又多少毫秒 8.64e7
              // 不可以选择的日期 < 现在的日期-(365+25)天  即:2019-04-01之前的日期不可以选
              return time.getTime() < Date.now() - (days + monthDayNum) * 8.64e7;
            }
          }
        },
        limitHistoryTime: {
          /**
           * 限制选择查询历史1年前数据
           * @param time
           * @returns {boolean}
           */
          disabledDate: function(time) {
            if (new Date(time).getTime() > new Date().getTime()) {
              return time.getTime() >= new Date().getTime(); //时间范围必须是时间戳
            } else {
              // 因为项目要求是查找一年之之前的数据 前如 2019-03-30 之前的数据
              // 需要找出现在 2020-04-25 到 2019-04-01有多少天
              // 1.判断年,平年还是闰年
              let y = new Date().getFullYear() - 1;
              // 用年份除以4,如果没有余数就是闰年,如果有余数就是平年。
              let isLeap = (0 === y % 4 && 0 === y % 100) || 0 === y % 400;
              // 平年的2月是28天,闰年是的2月是29天 因此闰年比平年多一天
              // 2019 是 365天
              let days = isLeap ? 366 : 365;
              // getDate 获取现在月份的天数,因为是从0开始,所以,实际日期要比获取到的多一
              // 现在2020-04-25 所以这个月已经过了25天
              let monthDayNum = new Date().getDate() + 1;
              // 可以选择的日期 < 现在的日期-(365+25)天  即:2019-04-01之前的日期不可以选
              return time.getTime() > Date.now() - (days + monthDayNum) * 8.64e7;
            }
          }
        }
      },
    }
  },
  methods: {
    /*当前历史的切换方法: 切换默认可选时间范围
     * 例如: 1个月前
     * */
    changeHistory() {
      this.dataPickerData.datePickerSpace = null;
      this.dataPickerData.limitDatePickerSpace = null;
      let end = null;
      let start = null;
      if (this.historyFlag === "H") {
        end = formatUtil.transformationDate(new Date(), "year", 1);
        start = formatUtil.transformationDate(end, "year", 1);
      } else {
        end = formatUtil.transformationDate(
          formatUtil.dateFormat(new Date(), "yyyy-MM-dd")
        );
        start = formatUtil.transformationDate(new Date(), "year", 1);
      }
      this.dataPickerData.limitDatePickerSpace = [start, end];
    }
  },
  watch: {
    // 查询条件时间处理:将时间数组拆分并放入查询条件中
    "dataPickerData.datePickerSpace": function(val) {
      if (val && val.length > 0) {
        this.startDate = val[0];
        this.endDate = val[1];
      } else {
        this.startDate = null;
        this.endDate = null;
      }
    }
  }
}
</script>

因为按照有按年限制的也有要按照几个月份限制的,所以小编将这些封装了一个工具类

let demoFormatUtil = {};

/**
 * 时间日期处理:根据传入日期:返回之前的几年,几月,几日的日期:返回格式:“YY-MM-DD”
 * @param date 时间new Date()或者“2020-03-24”
 * @param dateType Y:年,M:月,D:日
 * @param dateNum 几年,几月,几天
 *
 */
demoFormatUtil.transformationDate = function(date, dateType, dateNum) {
  let retrueDate;
  let dateValue = new Date(Date.parse(date));
  /*返回前几年*/
  if (dateType === "year") {
    dateValue.setFullYear(dateValue.getFullYear() - dateNum);
  }
  /*返回前几月*/
  if (dateType === "month") {
    dateValue.setMonth(dateValue.getMonth() - dateNum);
  }
  /*返回前几天*/
  if (dateType === "day") {
    dateValue.setDate(dateValue.getDate() - dateNum);
  }
  let yy = dateValue.getFullYear();
  let mm = dateValue.getMonth() + 1; //因为getMonth()返回值是 0(一月) 到 11(十二月) 之间的一个整数。所以要给其加1
  let dd = dateValue.getDate();
  if (mm < 10) {
    mm = "0" + mm;
  }
  if (dd < 10) {
    dd = "0" + dd;
  }
  retrueDate = yy + "-" + mm + "-" + dd;
  return retrueDate;
};
/**
 * 日历控件,配置时间限制
 * @type {{oneDayBefore: (function(*): boolean), todayDayBefore: (function(*): boolean)}}
 */
demoFormatUtil.pickerOptions = {
  /**
   * 限制选择今天之前日期(包括今天)
   * @param time
   * @returns {boolean}
   */
  todayDay: {
    disabledDate: function(time) {
      return time.getTime() > Date.now();
    }
  },
  /**
   * 限制选择今天之前日期(不包括今天)
   * @param time
   * @returns {boolean}
   */
  todayDayBefore: {
    disabledDate: function(time) {
      return time.getTime() > Date.now() - 1 * 8.64e7;
    }
  },
  /**
   * 限制选择近1年的日期(去年的本月1日到今天)
   * @param time
   * @returns {boolean}
   */
  oneYear: {
    disabledDate: function(time) {
      if (new Date(time).getTime() > new Date().getTime()) {
        return time.getTime() >= new Date().getTime(); //时间范围必须是时间戳
      } else {
        // 判断年 导历史按月
        let y = new Date().getFullYear() - 1;
        let isLeap = (0 === y % 4 && 0 === y % 100) || 0 === y % 400;
        let days = isLeap ? 366 : 365;
        let monthDayNum = new Date().getDate() + 1;
        return time.getTime() < Date.now() - (days + monthDayNum) * 8.64e7;
      }
    }
  },
  /**
   * 限制选择查询历史1年前数据
   * @param time
   * @returns {boolean}
   */
  oneYearBefore: {
    disabledDate: function(time) {
      if (new Date(time).getTime() > new Date().getTime()) {
        return time.getTime() >= new Date().getTime(); //时间范围必须是时间戳
      } else {
        let y = new Date().getFullYear() - 1;
        let isLeap = (0 === y % 4 && 0 === y % 100) || 0 === y % 400;
        let days = isLeap ? 366 : 365;
        let monthDayNum = new Date().getDate() + 1;
        return time.getTime() > Date.now() - (days + monthDayNum) * 8.64e7;
      }
    }
  }
};
export default demoFormatUtil;```
引入工具工具类

```javascript
<template>
    <!--vue 时间选择控件测试-->
    <div class="hello">
        <div>
            选中的日期:{{startDate}}{{endDate}}
        </div>
        <div>
            时间范围:
            <el-radio
                    v-model="historyFlag"
                    @change="changeHistory"
                    label="D"
            >
                近一年</el-radio
            >
            <el-radio
                    v-model="historyFlag"
                    @change="changeHistory"
                    label="H"
            >
                历史</el-radio
            >
        </div>
        <div
        >
            <div >
                操作时间:<el-date-picker
                    v-model="dataPickerData.datePickerSpace"
                    type="daterange"
                    unlink-panels
                    :default-value="dataPickerData.limitDatePickerSpace"
                    value-format="yyyy-MM-dd"
                    range-separator="至"
                    start-placeholder="
               开始日期
              "
                    end-placeholder="结束日期"
                    :picker-options="
                historyFlag === 'D'
                  ? dataPickerData.limitCurrentTime
                  : dataPickerData.limitHistoryTime
              "
            >
            </el-date-picker>
            </div>
        </div>
    </div>
</template>

<script>
import formatUtil from "./formatUtil";
export default {
  name: 'DatePickerDemo',
  data () {
    return {
      startDate: "",
      endDate: "",
      // 历史选择变量
      historyFlag: "D",
      // 为了区分点击时候没有查询就导出,导致导出历史记录混乱的三方变量
      isSearchHistory: "D",
      dataPickerData: {
        // 日期时间选择数组【开始时间,结束时间】
        datePickerSpace: null,
        // 日期选择数组空间可选范围控制
        limitDatePickerSpace: null,
        limitCurrentTime: formatUtil.pickerOptions.oneYear,
        limitHistoryTime: formatUtil.pickerOptions.oneYearBefore
      },
    }
  },
  methods: {
    /*当前历史的切换方法: 切换默认可选时间范围
     * 例如: 1个月前
     * */
    changeHistory() {
      this.dataPickerData.datePickerSpace = null;
      this.dataPickerData.limitDatePickerSpace = null;
      let end = null;
      let start = null;
      if (this.historyFlag === "H") {
        end = formatUtil.transformationDate(new Date(), "year", 1);
        start = formatUtil.transformationDate(end, "year", 1);
      } else {
        end = formatUtil.transformationDate(
          formatUtil.dateFormat(new Date(), "yyyy-MM-dd")
        );
        start = formatUtil.transformationDate(new Date(), "year", 1);
      }
      this.dataPickerData.limitDatePickerSpace = [start, end];
    }
  },
  watch: {
    // 查询条件时间处理:将时间数组拆分并放入查询条件中
    "dataPickerData.datePickerSpace": function(val) {
      if (val && val.length > 0) {
        this.startDate = val[0];
        this.endDate = val[1];
      } else {
        this.startDate = null;
        this.endDate = null;
      }
    }
  }
}
</script>

相关标签: 前端之vue vue.js