antd Rangpicker 选择小时项,及日期和小时禁用

时间:2024-12-19 13:03:26

需求:日期范围选择,精确到小时,并且不能选择当前时间之前的时间,包括小时时间

antd的例子中,虽然有范围选择器里可以选择时分秒的样例,但我们需求并不需要选择分、秒,只需选择到时就行。

只需在 format 属性中设置自己想要的日期格式即可 format={‘YYYY-MM-DD HH’}

<RangePicker 
    showTime
    format={'YYYY-MM-DD HH'}
</RangePicker>
  • 1
  • 2
  • 3
  • 4

同样,虽然说antd官网给的例子中,有关于日期及小时禁用的样例,但是所给样例的小时,是每日的小时都禁用了。这不符合我们的需求,我们想要的是只禁用早于当前时间的小时,如果选择明后日以及之后的小时,是所有小时都可以选择的。

这里我们用 disabledDate 来禁用 ,用 disabledTime 来禁用

    disabledDate={(current: any) => {
        const disabledTime = moment();
        const hour = moment(disabledTime).hour();
        return current && hour < 23 ? current < moment(disabledTime).subtract(1, 'd') : current < moment(disabledTime)
    }}
  • 1
  • 2
  • 3
  • 4
  • 5
	disabledTime={(now: any, partial: any) => {
	    if(now){
	        const disabledTime = moment();
	        const disabledDay = moment(disabledTime).date();
	        const nowDay = moment(now).date();
	        if(disabledDay === nowDay){
	            return  ({disabledHours: () => {
	                let hours: number[] = [];
	                let time: any = moment();
	                let hour = moment(time).hour();
	                for(let i = 0; i < hour ; i ++){
	                    hours.push(i);
	                }
	                return hours
	            }}) 
	        }
	    }
	    return {}
	}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

自此,文章开头所提需求就全部可以实现了,总体代码如下:

<RangePicker 
   showTime
   format={'YYYY-MM-DD HH'}
   disabledDate={(current: any) => {
       const disabledTime = moment();
       const hour = moment(disabledTime).hour();
       return current && hour < 23 ? current < moment(disabledTime).subtract(1, 'd') : current < moment(disabledTime)
   }}
   disabledTime={(now: any, partial: any) => {
       if(now){
           const disabledTime = moment();
           const disabledDay = moment(disabledTime).date();
           const nowDay = moment(now).date();
           if(disabledDay === nowDay){
               return  ({disabledHours: () => {
                   let hours: number[] = [];
                   let time: any = moment();
                   let hour = moment(time).hour();
                   for(let i = 0; i < hour + 1 ; i ++){
                       hours.push(i);
                   }
                   return hours
               }}) 
           }
       }
       return {}
   }}
/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28