elementUi el-date-picker时间控件精确到时分秒

1.时间日期type=datetime

html 复制代码
<template>
  <el-date-picker
    v-model="time"
    :picker-options="pickerOptions"
    ref="datetime"
    type="datetime"
    :default-time="range"
    :disabled="disabled"
    placeholder="请选择日期时间"
    :format="format"
    :value-format="valueFormat"
  ></el-date-picker>
</template>

<script>
import dayjs from "dayjs";

export default {
  name: "DateTimePickerRange",
  props: {
    range: {
      type: String,
      default: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss") + " - 23:59:59"
    },
    disabled: {
      type: Boolean,
      default: false
    },
    value: {
      type: String,
      default: ""
    },
    format: {
      type: String,
      default: "yyyy-MM-dd HH:mm:ss"
    },
    valueFormat: {
      type: String,
      default: "yyyy-MM-dd HH:mm:ss"
    }
  },
  computed: {
    time: {
      get() {
        return this.value;
      },
      set(newVal) {
        this.$emit("input", newVal);
      }
    }
  },
  watch: {
    time: {
      handler(newValue) {
        if (newValue != null && newValue !== "") {
          if (
            dayjs(new Date())
              .format("YYYY-MM-DD HH:mm:ss")
              .split(" ")[0] == newValue.split(" ")[0]
          ) {
            this.pickerOptions.selectableRange =
              dayjs(new Date())
                .format("YYYY-MM-DD HH:mm:ss")
                .split(" ")[1] + " - 23:59:59";
          } else {
            this.pickerOptions.selectableRange = "00:00:00 - 23:59:59";
          }
        }
      }
    }
  },
  data() {
    return {
      // 在elementUI文档中提供的pickerOptions,这里设置disabledDate限制日期,onPick根据选择的日期进而显示时间
      pickerOptions: {
        disabledDate(time) {
          const dateTime = new Date();
          const startDateTime = dateTime.setDate(dateTime.getDate() - 1);
          return time.getTime() < new Date(startDateTime).getTime();
        },
        selectableRange: (() => {
          let date = new Date();
          let hour = date.getHours();
          let minute = date.getMinutes();
          let second = date.getSeconds();
          return `${hour}:${minute}:${second}` + " - 23:59:59";
        })()
      }
    };
  }
};
</script>

2.时间日期type=datetimerange

html 复制代码
<template>
  <el-date-picker v-model="timeArr" :picker-options="pickerOptions" ref="datetime" type="datetimerange"
    range-separator="~" start-placeholder="开始时间" end-placeholder="结束时间" format="yyyy-MM-dd HH:mm:ss"
    :default-time="defaultTime" :disabled="disabled" value-format="timestamp"></el-date-picker>
</template>

<script>
import dayjs from "dayjs";

const DateFormat = "YYYY-MM-DD";
const TimeFormat = "HH:mm:ss";
const StartTimeFormat = "00:00:00";
const ENDTimeFormat = "23:59:59";

export default {
  name: "DateTimePickerRange",
  props: {
    range: {
      type: Array,
      default: () => [dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss'), '23:59:59']
    },
    disabled: {
      type: Boolean,
      default: false
    },
    value: {
      type: Array,
      default: () => []
    }
  },
  computed: {
    timeArr: {
      get() {
        return this.value || [];
      },
      set(newVal) {
        this.$emit('input', newVal);
      }
    },
    defaultTime() {
      return [dayjs(new Date()).format('HH:mm:ss'), '23:59:59'];
    }
  },
  data() {
    return {
      startDate: '',
      startTime: '',
      // 在elementUI文档中提供的pickerOptions,这里设置disabledDate限制日期,onPick根据选择的日期进而显示时间
      pickerOptions: {
        disabledDate: time => {
          const [start, end] = this.range;
          const d = new Date(time).getTime();
          const pickDate = dayjs(time).format(DateFormat);
          const startDate = dayjs(start).format(DateFormat);
          const startTime = dayjs(start).format(TimeFormat);
          const startStamp = new Date(start).getTime();
          const endStamp = new Date(end).getTime();
          // 组件(界面)上的日期 和 时间范围中最小的日期  相同时
          if (pickDate === startDate && startTime !== ENDTimeFormat) {
            return false;
          }
          // 这里不用判断时间范围中最大的日期
          return d < startStamp || d >= endStamp; // 小于最小日期 或者 大于最大日期
        },
        onPick: ({ minDate, maxDate }) => {
          if (!(minDate && maxDate)) {
            // 选择完整的日期后,再进入后面的逻辑
            return;
          }
          const picker = this.$refs.datetime && this.$refs.datetime.picker;
          const { minTimePicker, maxTimePicker } = picker.$refs;
          const [start, end] = this.range;
          const pickStartDate = dayjs(minDate).format(DateFormat); // 手动选择的最小日期
          const pickEndDate = dayjs(maxDate).format(DateFormat); // 手动选择的最大日期
          // const startDate = dayjs(start).format(DateFormat); // 时间范围this.range,最小日期 年月日
          // const startTime = dayjs(start).format(TimeFormat); // 时间范围this.range,最小时间 时分秒
          const startDate = dayjs(new Date()).format(DateFormat); // 时间范围this.range,最小日期 年月日
          const startTime = dayjs(new Date()).format(TimeFormat); // 时间范围this.range,最小时间 时分秒
          const endDate = dayjs(end).format(DateFormat); // 时间范围this.range,最大日期 年月日
          const endTime = dayjs(end).format(TimeFormat); // 时间范围this.range,最大日期 年月日

          this.startDate = startDate;
          this.startTime = startTime;

          // 手动选择的最小日期 等于 时间范围this.range的最小日期,那么需要限制时间范围
          if (pickStartDate === startDate) {
            minTimePicker.selectableRange = [
              [
                new Date(`${startDate} ${startTime}`),
                new Date(`${startDate} ${ENDTimeFormat}`)
              ]
            ];

          } else {
            // 不相等,则可以选择全部的时间范围,不需要做限制
            minTimePicker.selectableRange = [];
          }
          // 手动选择的最大日期 等于 时间范围this.range的最大日期,那么需要限制时间范围
          if (pickEndDate === endDate) {
            maxTimePicker.selectableRange = [
              [
                new Date(`${endDate} ${StartTimeFormat}`),
                new Date(`${endDate} ${endTime}`)
              ]
            ];
          } else {
            // 不相等,则可以选择全部的时间范围,不需要做限制
            maxTimePicker.selectableRange = [];
          }
        }
      }
    };
  },
};
</script>
相关推荐
满楼、10 天前
el-cascader 设置可以手动输入也可以下拉选择
javascript·vue.js·elementui
海天胜景10 天前
vue3 el-table 根据字段值 改变整行字体颜色
javascript·vue.js·elementui
资深柠檬精10 天前
报错 @import “~element-ui/packages/theme-chalk/src/index“;
前端·elementui
海天胜景10 天前
vue3 el-table 行颜色根据 字段改变
javascript·vue.js·elementui
我的心巴11 天前
Vue2 ElementUI Tree 拖动目标节点能否被放置及获取放置位置
前端·vue.js·elementui
刘 怼怼12 天前
Element UI 表格中实现搜索关键字高亮的
vue.js·ui·elementui
BillKu12 天前
vue3 + TypeScript +Element Plus 输入框回车事件 @keydown.enter
vue.js·elementui·typescript
Luffe船长13 天前
vue+elementUI实现固定table超过设定高度显示下拉条
前端·elementui·vue
ew4521813 天前
【VUE】某时间某空间占用情况效果展示,vue2+element ui实现。场景:会议室占用、教室占用等。
前端·vue.js·ui·elementui
BillKu14 天前
Element Plus 对话框 el-dialog 和 抽屉 el-drawer 的使用注意项(使用 div 包裹)
javascript·vue.js·elementui