问题描述:
日期组件,选择任意时间月份开始,但必须选择一年时间以内的连续月份!!!
实现效果
解决方案
在这里插入代码片
<div style="display: flex">
<a-month-picker
v-model="form.startValue"
placeholder="Start"
@openChange="handleStartOpenChange"
/>
<a-month-picker
v-model="form.endValue"
:disabled-date="disabledEndDate"
placeholder="End"
:open="endOpen"
@openChange="handleEndOpenChange"
/>
</div>
import dayjs from "dayjs";
export default {
data() {
return {
endOpen: false,
form: {
startValue: null,
endValue: null,
},
}
},
watch: {
'form.startValue'(val) {
// 监听,处理点击遮罩层关闭弹框时,结束时间限制不对
let { startValue,endValue } = this.form
let startY = dayjs(startValue).year()
let startM = dayjs(startValue).month()
let endY = dayjs(endValue).year()
let endM = dayjs(endValue).month()
if((startY == endY && endM >= startM) || (endY - startY == 1 && endM < startM)){
}else{
this.form.endValue=val
}
},
},
methods: {
// disabledStartDate(startValue) {
// let { endValue } = this.form
// if (!startValue || !endValue) {
// return false;
// }
// return startValue.valueOf() > endValue.valueOf();
// },
disabledEndDate(endValue) {
let { startValue } = this.form
if (!endValue || !startValue) {
return false;
}
// 方法一、分别获取年月来比较一下
let startY = dayjs(startValue).year()
let startM = dayjs(startValue).month()
let endY = dayjs(endValue).year()
let endM = dayjs(endValue).month()
let flag = true
if ((startY == endY && endM >= startM) || (endY - startY == 1 && endM < startM)) {
flag = false
} else {
flag = true
}
return flag
// 方法二、开始时间加1年,不超过1年 并且不小于开始时间
// 后面还写道一个时间选择范围精确到时分秒,经测试这个方案更准确
// var dateTime = new Date(startValue);
// dateTime = dateTime.setYear(dateTime.getFullYear() + 1);
// dateTime = new Date(dateTime);
// return startValue.valueOf() >= endValue.valueOf()
// || endValue.valueOf() >= dateTime.valueOf()
},
handleStartOpenChange(open) {
if (!open) {
this.endOpen = true;
}
},
handleEndOpenChange(open) {
this.endOpen = open;
},
},
}
补充一个精确到时分秒的案例(最长连续选择12个月),在相同年月日情况下,保证结束时间时分秒大于起始时间
<div style="display: flex; margin: 6px 0 0 0">
<a-date-picker
style="width: 250px"
show-time
v-model="form.startValue"
placeholder="Start"
@openChange="handleStartOpenChange"
:allowClear="false"
:disabled-date="disabledStartDate"
/>
<a-date-picker
style="width: 250px"
show-time
v-model="form.endValue"
:disabled-date="disabledEndDate"
placeholder="End"
:open="endOpen"
@openChange="handleEndOpenChange"
:allowClear="false"
/>
</div>
import dayjs from "dayjs";
export default {
data() {
return {
endOpen: false,
// 设置默认时间 30天前-现在
form: {
startValue: dayjs().subtract(30, 'day').format('YYYY-MM-DD HH:mm:ss'),
endValue: dayjs().format('YYYY-MM-DD HH:mm:ss'),
},
}
},
watch: {
// 监听,处理点击遮罩层关闭弹框时,结束时间限制不对
// 直接比较时间大小
'form.startValue'(val) {
// 方法1
// let { startValue, endValue } = this.form
// var formatDate1 = new Date(startValue)
// var formatDate2 = new Date(endValue)
// if (formatDate1 >= formatDate2) {
// this.form.endValue = val
// }
// 方法2
if(dayjs(startValue).isAfter(dayjs(endValue))){
this.form.endValue = val
}
},
},
methods: {
disabledStartDate(startValue) {
},
disabledEndDate(endValue) {
let { startValue } = this.form
if (!endValue || !startValue) {
return false;
}
var dateTime = new Date(startValue);
dateTime = dateTime.setYear(dateTime.getFullYear() + 1);
dateTime = new Date(dateTime);
return startValue.valueOf() >= endValue.valueOf()
|| endValue.valueOf() >= dateTime.valueOf()
},
handleStartOpenChange(open) {
if (!open) {
this.endOpen = true;
}
},
handleEndOpenChange(open) {
this.endOpen = open;
},
},
}
一些百度就知道的知识 dayjs moment 随机示例,用法我猜差不多,就当了解一下
关于时间的方法,之前一直没怎么去了解过,原来很多好用的api
moment解读常用操作及语句——subtract、add、calendar
将来就是加add,曾经就是减subtract, 现在是moment(),calendar日历格式。
链式操作举例:moment().add(7, ‘days’).subtract(1, ‘months’) // 意思为当前日期加上7天再减去一个月,时分秒和当前保持一致
Is Before
这表示 Day.js 对象是否在另一个提供的日期时间之前。
dayjs().isBefore(dayjs(‘2011-01-01’)) // 默认毫秒
Is Same
这表示 Day.js 对象是否和另一个提供的日期时间相同。
dayjs().isSame(dayjs(‘2011-01-01’)) // 默认毫秒
Is After
这表示 Day.js 对象是否在另一个提供的日期时间之后。
dayjs().isAfter(dayjs(‘2011-01-01’)) // 默认毫秒
Is Same or Before
这表示 Day.js 对象是否和另一个提供的日期时间相同或在其之前。
这依赖 IsSameOrBefore 插件,才能正常运行
dayjs.extend(isSameOrBefore)
dayjs().isSameOrBefore(dayjs(‘2011-01-01’)) // 默认毫秒
Is Same or After
这表示 Day.js 对象是否和另一个提供的日期时间相同或在其之后。
这依赖 IsSameOrAfter 插件,才能正常运行
dayjs.extend(isSameOrAfter)
dayjs().isSameOrAfter(dayjs(‘2011-01-01’)) // 默认毫秒
Is Between
这表示 Day.js 对象是否在其他两个的日期时间之间。
这依赖 IsBetween 插件,才能正常运行
dayjs.extend(isBetween)
dayjs(‘2010-10-20’).isBetween(‘2010-10-19’, dayjs(‘2010-10-25’))
以上api,如果想使用除了毫秒以外的单位进行比较,则将单位作为第二个参数传入
dayjs().isSameOrBefore(‘2011-01-01’, ‘year’)
Is a Dayjs
这表示一个变量是否为 Day.js 对象。
dayjs.isDayjs(dayjs()) // true
dayjs.isDayjs(new Date()) // false
Is Leap Year
查询 Day.js 对象的年份是否是闰年。
这依赖 IsLeapYear 插件,才能正常运行
dayjs.extend(isLeapYear)
dayjs(‘2000-01-01’).isLeapYear() // true
写道这儿,发现多看看文档比瞎百度强,突然发现了更简单的方法,白瞎了时间!
// 比如上面这个代码
let { startValue,endValue } = this.form
let startY = dayjs(startValue).year()
let startM = dayjs(startValue).month()
let endY = dayjs(endValue).year()
let endM = dayjs(endValue).month()
if((startY == endY && endM >= startM) || (endY - startY == 1 && endM < startM)){
}else{
this.form.endValue=val
}
//直接修改为
if(dayjs(startValue).isAfter(dayjs(endValue),'month')){
this.form.endValue = val
}