el-date-picker 日,周 ,月,自定义日期的使用总结
效果图:
按日 按周 按月
自定义:
<template>
<div class="date">
<div class="data-left">
<div class="time-text">时间选择</div>
<el-select
class="date-type-picker"
v-model="dateType"
@change="dateTypeChange"
placeholder="请选择类型">
<el-option
v-for="item in dateTypeArr"
:key="item.name"
:label="item.name"
:value="item.value">
</el-option>
</el-select>
<!--按日-->
<el-date-picker
v-show="dateType == '0'"
:clearable="false"
v-model="dayValue"
@change="changeDayValue()"
type="date"
value-format="timestamp"
:picker-options="pickerOptions"
placeholder="选择日期">
</el-date-picker>
<!--按周-->
<el-date-picker
v-show="dateType == '1'"
:clearable="false"
v-model="weekValue"
type="week"
format="yyyy 第 WW 周"
@change="changeWeekValue()"
:picker-options="pickerOptions"
placeholder="请选择周">
</el-date-picker>
<!--按月-->
<el-date-picker
v-show="dateType == '2'"
:clearable="false"
v-model="monthValue"
@change="changeMonthValue()"
type="month"
:picker-options="pickerOptions"
placeholder="请选择月">
</el-date-picker>
<!--自定义-->
<el-date-picker
v-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-select
v-model="dataForm.eventType"
placeholder="请选择事件类型"
filterable
clearable
@change="changeParameter">
<el-option
v-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.startTime
if (sub > 2678400000) {// 一天的时间戳为86400000
this.$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-27
value-format="yyyy-MM-dd HH:mm:ss" //2018-12-27 00:00:00
value-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-picker
style="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() - 1000
picker.$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:59
return 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) {
// 当前时间,并设置分钟、秒为 0
let 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-25
var aa = new Date(oldTime).format("yyyyMMdd");//20141225
datePicker类型为周/月的时候获取开始时间和结束时间
- 为周(获取周一到周日的时间段)
- 为月(获取月初到月末的时间段)
<!--时间检索 按天-->
<span v-if="timeType == 'day'">
<el-form-item >
<el-date-picker
v-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-picker
v-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-picker
v-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-picker
style="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;