需求:日期范围选择,精确到小时,并且不能选择当前时间之前的时间,包括小时时间
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