antd 的MonthPicker、DatePicker任意时间开始,选择连续时间最长跨度为1年,disabledDate 不可选择的日期

问题描述:

日期组件,选择任意时间月份开始,但必须选择一年时间以内的连续月份!!!

实现效果

在这里插入图片描述

解决方案

在这里插入代码片
<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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要让 antd DatePicker 可以修改时间并设置为所选日期的 00 点 00 分 00 秒,可以使用 DatePicker 组件的 `showTime` 属性和 `defaultValue` 属性来实现。 示例代码: ```jsx import { DatePicker } from 'antd'; import moment from 'moment'; const { RangePicker } = DatePicker; function onChange(dates, dateStrings) { console.log('From: ', dates[0], ', to: ', dates[1]); console.log('From: ', dateStrings[0], ', to: ', dateStrings[1]); } function disabledDate(current) { // Can not select days before today and today return current && current < moment().endOf('day'); } function disabledDateTime() { return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [], }; } function disabledRangeTime(_, type) { if (type === 'start') { return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [], }; } return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [], }; } function App() { return ( <div> <DatePicker showTime={{ defaultValue: moment('00:00:00', 'HH:mm:ss') }} defaultValue={moment('2021-06-01', 'YYYY-MM-DD')} disabledDate={disabledDate} disabledTime={disabledDateTime} format="YYYY-MM-DD HH:mm:ss" onChange={onChange} /> </div> ); } export default App; ``` 在 `showTime` 属性中,设置 `defaultValue` 为所选日期的 00 点 00 分 00 秒,即 `moment('00:00:00', 'HH:mm:ss')`。 在 `defaultValue` 属性中,设置默认选中日期为 `moment('2021-06-01', 'YYYY-MM-DD')`。 这样设置之后,就可以在 antd DatePicker 组件中选择日期时间,并且默认时间为所选日期的 00 点 00 分 00 秒。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值