el-date-picker 日,周 ,月,自定义日期的使用总结
效果图:
按日 按周 按月


自定义:
<template><div class="date"><div class="data-left"><div class="time-text">时间选择</div><el-selectclass="date-type-picker"v-model="dateType"@change="dateTypeChange"placeholder="请选择类型"><el-optionv-for="item in dateTypeArr":key="item.name":label="item.name":value="item.value"></el-option></el-select><!--按日--><el-date-pickerv-show="dateType == '0'":clearable="false"v-model="dayValue"@change="changeDayValue()"type="date"value-format="timestamp":picker-options="pickerOptions"placeholder="选择日期"></el-date-picker><!--按周--><el-date-pickerv-show="dateType == '1'":clearable="false"v-model="weekValue"type="week"format="yyyy 第 WW 周"@change="changeWeekValue()":picker-options="pickerOptions"placeholder="请选择周"></el-date-picker><!--按月--><el-date-pickerv-show="dateType == '2'":clearable="false"v-model="monthValue"@change="changeMonthValue()"type="month":picker-options="pickerOptions"placeholder="请选择月"></el-date-picker><!--自定义--><el-date-pickerv-show="dateType == '3'":clearable="false"v-model="dataForm.createTime"type="daterange"align="right"size="small"range-separator="至"start-placeholder="开始日期"end-placeholder="结束日期"value-format="timestamp":picker-options="pickerOptions"@change="changeParameter":default-time="defaultTime"></el-date-picker><div class="event-type"><div class="title-text">事件类型</div><el-selectv-model="dataForm.eventType"placeholder="请选择事件类型"filterableclearable@change="changeParameter"><el-optionv-for="item in typeList":key="item.name":label="item.name":value="item.type"></el-option></el-select></div></div><div class="search"><el-button size="mini" @click="statisticalEvent()">搜索</el-button><el-button class="m-l-15 reset-btn" size="mini"@click="resetForm()">重置</el-button></div></div></template><script>import {eventTypeList} from "../../../api/eventProcessing";import {debounce} from "../../../utils";export default {exeSearchname: "topSearch",data() {return {dateType: '0', // 日期类型,默认为按日dayValue: new Date().setHours(0, 0, 0, 0), // 按照日的weekValue: '', // 按周monthValue: '', // 按月dateTypeArr: [{name: '按日',value: '0'},{name: '按周',value: '1'},{name: '按月',value: '2'},{name: '自定义',value: '3'}],// 时间快捷选项pickerOptions: {// shortcuts: [// {// text: "今天",// onClick(picker) {// const end = new Date().getTime();// const start = new Date();// start.setHours(0, 0, 0, 0);// picker.$emit("pick", [start.setHours(0, 0, 0, 0), end]);// }// },// {// text: "昨天",// onClick(picker) {// const end = new Date();// const start = new Date();// start.setTime(start.getTime() - 3600 * 1000 * 24);// end.setHours(0, 0, 0, 0);// const endT = end.getTime() - 1000// picker.$emit("pick", [start.setHours(0, 0, 0, 0), endT]);// }// },// {// text: '近7天',// onClick(picker) {// const end = new Date().getTime();// const start = new Date();// start.setTime(start.getTime() - 3600 * 1000 * 24 * 6);// picker.$emit('pick', [start.setHours(0, 0, 0, 0), end]);// }// },// {// text: "最近一个月",// onClick(picker) {// const end = new Date().setHours(23, 59, 59, 0);// const start = new Date();// start.setTime(start.getTime() - 3600 * 1000 * 24 * 29);// picker.$emit("pick", [start.setHours(0, 0, 0, 0), end]);// }// }// ],disabledDate(time) {return time.getTime() > new Date().setHours(23, 59, 59, 0);}},dataForm: {startTime: "",endTime: "",createTime: [new Date().setHours(0, 0, 0, 0), new Date().getTime()],eventType: "",reportType: 1, // 报告类型},typeList: [],// 事件类型选择timeOut: ''}},computed: {defaultTime: function () {return ["00:00:00", "23:59:59"]}},destroyed() {if (this.timeOut != '') {clearTimeout(this.timeOut);this.timeOut = '';}},mounted() {if (this.timeOut != '') {clearTimeout(this.timeOut);this.timeOut = '';this.timeOut = setTimeout(() => {this.intEventTypeList()this.statisticalEvent()}, 200)} else {this.timeOut = setTimeout(() => {this.intEventTypeList()this.statisticalEvent()}, 200)}},watch: {'$store.state.region'() {setTimeout(() => {this.$emit('exeSearch', this.dataForm)}, 500)},},methods: {// 时间类型变化 日,周,月 恢复默认dateTypeChange() {// 按日if (this.dateType === '0') {this.dataForm.reportType = 1;this.dayValue = new Date().setHours(0, 0, 0, 0);let tmpDay = new Date().setHours(0, 0, 0, 0);this.dataForm.createTime = [Number(tmpDay.getTime()), Number(tmpDay.getTime()) + 86400000 - 1]this.statisticalEvent();}// 按周if (this.dateType === '1') {this.dataForm.reportType = 7;// 当前日期let tmpDate = new Date();let tmpTimestamp = tmpDate.getTime();// 当前日期的 日let tmpDay = tmpDate.getDay();// 当前周的 周一let tmpMonday = new Date(tmpTimestamp - (tmpDay - 1) * 60 * 60 * 24 * 1000);tmpMonday.setHours(0, 0, 0, 0);this.weekValue = tmpMonday;let tmpDayTimestamp = 86400000;// 周的开始 时间戳let start = tmpMonday.getTime() - tmpDayTimestamp;// 周的结束 时间戳let end = tmpMonday.getTime() + tmpDayTimestamp * 6 - 1;this.dataForm.createTime = [start, end]this.statisticalEvent();}// 按月if (this.dateType === '2') {this.dataForm.reportType = 31;// 一天时间的毫秒数let tmpDayTimestamp = 86400000;// 当前日期let tmpDate = new Date();// 当前日期的日设置为 当前月的 1 号tmpDate.setUTCDate(1);// 设置 1 号的时间为 0点0分0秒0毫秒tmpDate.setHours(0, 0, 0, 0);this.monthValue = tmpDate;// 获取当前月的天数let days = new Date(tmpDate.getFullYear(), tmpDate.getMonth() + 1, 0).getDate();// 月 第一天0点的时间戳let monthStartTimestamp = tmpDate.getTime();// 月 最后一天 23:59:59 的时间戳let monthEndTimestamp = tmpDate.getTime() + tmpDayTimestamp * days - 1;// 当前月份的 开始 结束 时间戳数组this.dataForm.createTime = [monthStartTimestamp, monthEndTimestamp]this.statisticalEvent();}// 自定义if (this.dateType === '3') {this.dataForm.reportType = 0;this.dataForm.createTime = [new Date().setHours(0, 0, 0, 0), new Date().getTime()];this.statisticalEvent();}},// 按月changeMonthValue() {this.dataForm.reportType = 31;let tmpDayTimestamp = 86400000;let tmpDate = new Date(this.monthValue);let days = new Date(tmpDate.getFullYear(), tmpDate.getMonth() + 1, 0).getDate();let monthStartTimestamp = tmpDate.getTime();let monthEndTimestamp = tmpDate.getTime() + tmpDayTimestamp * days - 1;this.dataForm.createTime = [monthStartTimestamp, monthEndTimestamp]this.statisticalEvent();},// 按周changeWeekValue() {this.dataForm.reportType = 7;// 一天的毫秒数let tmpDayTimestamp = 86400000;// 选择的周let tmpTimestamp = new Date(this.weekValue);// 周的开始时间戳let start = tmpTimestamp.getTime() - tmpDayTimestamp;// 周到结束时间戳let end = tmpTimestamp.getTime() + tmpDayTimestamp * 6 - 1;this.dataForm.createTime = [start, end]this.statisticalEvent();},// 按日changeDayValue() {this.dataForm.reportType = 1;this.dataForm.createTime = [Number(this.dayValue), Number(this.dayValue) + 86400000 - 1]this.statisticalEvent();},intEventTypeList() {eventTypeList().then(res => {if (res.code === 0) {this.typeList = []res.data.forEach(item => {this.typeList.push({name: item.signName,type: item.signType})})}})},// 选择时间,或选择时间类型后 调用changeParameter() {this.dataForm.time = ' ';// 选择时间,点击确定this.dataForm.startTime = String(this.dataForm.createTime[0]);this.dataForm.endTime = String(this.dataForm.createTime[1]);this.statisticalEvent()},// 重置resetForm() {this.$nextTick(() => {//取消选中样式this.dataForm.time = "0";this.dataForm.sensorType = '';this.dataForm.startTime = '';this.dataForm.endTime = '';this.dataForm.eventType = '';this.dataForm.createTime = [new Date().setHours(0, 0, 0, 0), new Date().getTime()];this.dateType = '0'; // 默认按日this.dayValue = new Date().setHours(0, 0, 0, 0); // 默认为当天this.dataForm.reportType = 1; // 报告类型默认// 重置后,按照默认的时间 查询this.statisticalEvent()});},statisticalEvent: debounce(function () {this.doStatisticalEvent();}, 300, true),//初始化查询事件doStatisticalEvent() {this.dataForm.startTime = String(this.dataForm.createTime[0]);this.dataForm.endTime = String(this.dataForm.createTime[1]);let sub = this.dataForm.endTime - this.dataForm.startTimeif (sub > 2678400000) {// 一天的时间戳为86400000this.$message.warning('选择的日期不能超过31天!')this.dataForm.createTime = [new Date().setHours(0, 0, 0, 0), new Date().getTime()];this.dataForm.time = "0";this.dataForm.sensorType = '';this.dataForm.startTime = '';this.dataForm.endTime = '';return}this.$emit('exeSearch', this.dataForm)}}}</script><style lang="less" scoped>.date {display: flex;flex-direction: row;justify-content: center;align-items: center;width: 100%;background: @background4;height: calc(var(--num80) * var(--num));line-height: calc(var(--num80) * var(--num));}.data-left {height: 100%;width: 80%;display: flex;flex-direction: row;justify-content: flex-start;align-items: center;}.date-picker {margin-left: calc(var(--num24) * var(--num));}.date-type-picker {width: calc(var(--num98) * var(--num));margin: 0 calc(var(--num8) * var(--num));}.time-text {font-size: calc(var(--num14) * var(--num));color: @whiteText1;margin-left: calc(var(--num24) * var(--num));}.title-text {font-size: calc(var(--num14) * var(--num));color: @whiteText1;margin-right: calc(var(--num24) * var(--num));}.event-type {height: 100%;margin-left: calc(var(--num42) * var(--num));display: flex;flex-direction: row;}.search {display: flex;flex-direction: row;justify-content: flex-end;align-items: center;height: 100%;width: 20%;}.reset-btn {margin-right: calc(var(--num24) * var(--num));border: calc(var(--num1) * var(--num)) solid @lucencyPrimary4 !important;background: @background3 !important;color: @whiteText1;}.reset-btn:hover {border: calc(var(--num1) * var(--num)) solid @lucencyPrimary2 !important;background: @background3 !important;color: @primary3 !important;}</style>
- 获取当天0点时间戳
new Date(new Date().toLocaleDateString()).getTime()
- value-format是时间处理格式
value-format="yyyy-MM-dd" //2018-12-27value-format="yyyy-MM-dd HH:mm:ss" //2018-12-27 00:00:00value-format="timestamp" // 1483326245000 时间戳
- 日期date字符串格式转换为时间戳
new Date("2021-05-07 12:25:45").getTime().toString();
DatePicker的基本操作
type=”daterange” 时, 结束的时间为当日的 0 点,应该为结束日期的 23:59:59秒,
解决方法为 : 添加 :default-time=”defaultTime”
<el-date-pickerstyle="width:178px"size="mini"v-model="addform.time"type="date":default-time="defaultTime"format="yyyy-MM-dd HH:mm:ss":picker-options="pickerOptions0"placeholder="选择日期"></el-date-picker><script>data() {return {//默认日期 当天0点-当前时间 时间戳addform: {startTime: new Date(new Date().setHours(0, 0, 0, 0)).getTime(),endTime: new Date().getTime(),time: [new Date(new Date(new Date().setHours(0, 0, 0, 0))).getTime(), new Date().getTime()],},// 时间快捷选项pickerOptions: {shortcuts: [{text: "今天",onClick(picker) {const end = new Date();const start = new Date();//0点到当前时间 start.setHours(0, 0, 0, 0);start.setTime(new Date(new Date().toLocaleDateString()).getTime() );picker.$emit("pick", [start, end]);}},{text: "昨天",onClick(picker) {const end = new Date().setHours(0, 0, 0, 0);const start = new Date();start.setTime(start.getTime() - 3600 * 1000 * 24);const endT = end.getTime() - 1000picker.$emit("pick", [start.setHours(0, 0, 0, 0), endT]);}},{text: "最近一个月",onClick(picker) {const end = new Date().setHours(23, 59, 59, 0);const start = new Date();start.setTime(start.getTime() - 3600 * 1000 * 24 * 29);picker.$emit("pick", [start.setHours(0, 0, 0, 0), end]);}}]},disabledDate(time) { // 不可选择的时间,设置为当天的 23:59:59return time.getTime() > new Date().setHours(23, 59, 59, 0);}//选择今天以及之后的日期pickerOptions0: {disabledDate(time) {return time.getTime() < Date.now() - 8.64e7;}},//如果没有后面的-8.64e7就是选择除了今天之后的日期pickerOptions1: {disabledDate(time) {return time.getTime() < Date.now();},},// 不能选择当天之前的日期和两天之后的日期pickerOptions2: {disabledDate(time) {// 当前时间,并设置分钟、秒为 0let tmpDate = new Date();tmpDate.setHours(0);tmpDate.setMinutes(0);tmpDate.setSeconds(0);let startDate = tmpDate.getTime()let endDate = startDate + 3600000 * 24 * 2; // 两天的时间return (time.getTime() < new Date().getTime() - 8.64e7 ||time.getTime() > endDate);}},}},computed: {defaultTime: function () {return ["00:00:00", "23:59:59"]}},<script>
时间表单验证不超过多少小时
const validatecreateTime = (rule, value, callback) => {if (value) {const utc = value[1] - value[0];const time = utc / (60 * 60 * 1000);if (time > 2) {callback(new Error("时间选择跨度不能超过2小时")); //没有验证通过} else {callback(); //验证通过}} else {callback(new Error("请选择时间")); //没有验证通过}};
日期组件自定义当天有数据的样式标记
- 引入moment时间日期处理插件
import moment from "moment";data(){return{existDate: ["2021-06-21"],pickerOptions: {cellClassName: time => {if (this.existDate.includes(this.formatDate(time))) {return "red";}}},}}<style>.red {background: blue;color: white;border-radius: 50%;}</style>
获取指定第几天的时间戳
- 0 当天 fun_date(0)
- -7 最近一周(当前时间到前7天的时间) fun_date(7)
- -30 最近一个月 fun_date(30)
//获取指定第几天的时间戳 参数:正数是几天后 负数是几天前fun_date(num) {var date1 = new Date();//今天时间var time1 = new Date().getTime();var date2 = new Date(date1);date2.setDate(date1.getDate() + num);//num是正数表示之后的时间,num负数表示之前的时间,0表示今天var time2 = new Date(date2.getFullYear() + "-" + (date2.getMonth() + 1) + "-" + date2.getDate()).getTime();//判断time1 和 time2 的大小if (time1 - time2 <= 0) {this.queryItem.createTime = [time1, time2]} else {this.queryItem.createTime = [time2, time1]}}
时间戳转换 time(时间戳)
let timeFormatter = function(time){if(time){var date = new Date(time)//把定义的时间赋值进来进行下面的转换var year = date.getFullYear();var month = (date.getMonth() + 1).toString().padStart(2, "0");var day = date.getDate().toString().padStart(2, "0");var hour = date.getHours().toString().padStart(2, "0");var minute = date.getMinutes().toString().padStart(2, "0");var second = date.getSeconds().toString().padStart(2, "0");return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;}else{return '';}}
时间转换为时间戳
var data_1 = new Date('2021-09-06 16:00:00')var time1 = data_1.getTime();//1630915200000
时间戳转换成指定形式
Date.prototype.format = function(fmt) {var o = {"M+" : this.getMonth()+1, //月份"d+" : this.getDate(), //日"h+" : this.getHours(), //小时"m+" : this.getMinutes(), //分"s+" : this.getSeconds(), //秒"q+" : Math.floor((this.getMonth()+3)/3), //季度"S" : this.getMilliseconds() //毫秒};if(/(y+)/.test(fmt)) {fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));}for(var k in o) {if(new RegExp("("+ k +")").test(fmt)){fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));}}return fmt;};var time1 = new Date().format("yyyy-MM-dd hh:mm:ss");//当前时间转换成指定格式var time2 = new Date(1522207388000).format("yyyy-MM-dd hh:mm:ss");//时间戳转换成成指定格式var oldTime = (new Date()).getTime();// 指定日期转换为时间戳,再转为指定格式var curTime = new Date(oldTime).format("yyyy-MM-dd");//2014-12-25var aa = new Date(oldTime).format("yyyyMMdd");//20141225
datePicker类型为周/月的时候获取开始时间和结束时间
- 为周(获取周一到周日的时间段)
- 为月(获取月初到月末的时间段)
<!--时间检索 按天--><span v-if="timeType == 'day'"><el-form-item ><el-date-pickerv-model="queryItem.day"type="date"value-format="timestamp":picker-options="pickerOptions0"placeholder="选择日期"></el-date-picker></el-form-item></span><!--时间检索 按周--><span v-if="timeType == 'week'"><el-form-item ><el-date-pickerv-model="queryItem.week"type="week"format="yyyy 第 WW 周"@change="getWeek"placeholder="选择周"></el-date-picker></el-form-item></span><!--时间检索 按月--><span v-if="timeType == 'month'"><el-form-item ><el-date-pickerv-model="queryItem.month"type="month"@change="getMonth"placeholder="选择月"></el-date-picker></el-form-item></span>
- js
//分析周getWeek(val){var weekTime = this.getWeeklyStartTimeAndEndTime(val);this.dateObj.startTime = weekTime.startTime;this.dateObj.endTime = weekTime.endTime;},//分析月getMonth(val){let monthTime = this.getMonthlyStartTimeAndEndTime(val);this.dateObj.startTime = monthTime.startTime;this.dateObj.endTime = monthTime.endTime;},/** 获取周的开始和结束时间* */getWeeklyStartTimeAndEndTime(val) {let temp = {};// 标准时间,转为时间戳,// elementUi中el-date-picker type是周时,返回的是周一let timeStamp = val.getTime();// 周的开始时间temp.startTime = timeStamp - 24 * 60 * 60 * 1000;// 周的结束时间temp.endTime = timeStamp + (24 * 60 * 60 * 1000) * 6 - 1000;return temp},/** 获取某一年某一月的开始时间和结束时间* */getMonthlyStartTimeAndEndTime( val) {let temp = {};// 标准时间,转为时间戳// elementUi中el-date-picker type是月时,返回的是选择月的第一天let timeStamp = val.getTime();let year = moment(timeStamp).utcOffset(480).format("YYYY");let month = moment(timeStamp).utcOffset(480).format("MM");// 月开始时间temp.startTime = timeStamp;// 月结束时间temp.endTime = timeStamp + (24 * 60 * 60 * 1000) * this.getMonthDays(year, month) - 1000;return temp;},// 获取某一年某一月的天数getMonthDays(year, month) {let date = new Date(year, month, 0)return date.getDate()}
el-date-picker type为datetime时只能限制未来时间不可选但是限制不了时分秒
- type为datetimerange的没问题 可限制到十分秒
- 只能通过change时间强行改值 超出当前时间默认当前最新时间
<el-date-pickerstyle="width: 100%":clearable="false"placeholder="选择日期时间"v-model="confirmForm.confirmTime":picker-options="pickerBeginDateBefore"type="datetime"value-format="timestamp"@change="handchangeDate"></el-date-picker><script>import moment from 'moment'export default {data(){return{confirmForm:{confirmTime:''},//限制未来时间不可选 但是十分秒仍然可以选pickerBeginDateBefore: {disabledDate(time) {return time.getTime() > Date.now();}},}},methods:{handchangeDate() {let startAt = new Date(this.confirmForm.confirmTime) * 1000 / 1000;//如果选择的时间大于当前本地时间则赋值当前本地时间if (startAt > Date.now()) {this.confirmForm.confirmTime = new Date();}},}}</script>
选择时间,不能跨月
import moment from 'moment'; // 引入插件let currentDate = ''; // 当前选中的日期let disabledDate = time => { ////禁用日期let d = new Date(currentDate); // 获取当前选择时间let year = d.getFullYear(); // 获取当前 - 年let month = d.getMonth() + 1; // 获取当前 - 月let day = new Date(year, month, 0).getDate(); // 获取本月天数(获取下一个月的0日即前一月的最后一日)month = month > 9 ? month : '0' + month; // 优化月格式day = day > 9 ? day : '0' + day; // 优化日格式let startDay = `${year}-${month}-01 00:00:00`; // 当月第一天let endDay = `${year}-${month}-${day} 23:59:59`; // 当月最后一天let startTime = new Date(startDay).getTime(); // 第一天时间戳let endTime = new Date(endDay).getTime(); // 最后一天时间戳let cutTime = new Date(moment().format('YYYY-MM-DD 23:59:59')).getTime(); // 当前时间戳if (currentDate !== '') { // 是否选择日期,选择日期,禁用掉不符合要求的时间return (time.getTime() < startTime ||time.getTime() > endTime ||time.getTime() > cutTime);}return time.getTime() > cutTime; // 否则禁用大于当前时间的时间};let onPick = ({ minDate, maxDate }) => { // 选择时间事件currentDate = minDate.getTime();if (maxDate) {currentDate = '';}};let pickerOption = {disabledDate,onPick,};export default pickerOption;
