功能要求:使用两个antd日期时间选择datepicker分别作为开始时间、结束时间,开始时间的禁用日期设置为今天的前一天,禁用时间设置为今天当前时间点之前的时间,结束时间不能早于开始时间。
具体规则:
1. 设置开始时间DatePicker的规则,禁用今天前一天及之前的所有日期,并且禁用今天当前时间点之前的时间,如果选择的日期是今天之后的日期,时间点不做禁用限制。
2. 设置结束时间 DatePicker 的规则,结束时间不能早于开始时间。
import React, { useState } from 'react';
import { DatePicker, Space } from 'antd';
import moment from 'moment';
const App = () => {
const [startDate, setStartDate] = useState('');
const handleStartDateChange = (date) => {
setStartDate(date);
};
const disabledStartDate = (current) => {
return current && current < moment().subtract(1, 'days').endOf('day');
};
const disabledStartDateTime = (date) => {
if (date && date.isSame(moment(), 'day')) {
return {
disabledHours: () => Array.from({ length: moment().hour() }, (_, h) => h),
disabledMinutes: (hour) => {
if (hour === moment().hour()) {
return Array.from({ length: moment().minute() }, (_, m) => m);
}
return [];
},
disabledSeconds: (hour, minute) => {
if (hour === moment().hour() && minute === moment().minute()) {
return Array.from({ length: moment().second() }, (_, s) => s);
}
return [];
},
}
} else {
return {
disabledHours: () => [],
disabledMinutes: () => [],
disabledSeconds: () => [],
}
}
};
const disabledEndDate = (current) => {
if (!startDate) {
return false;
}
return current && current < startDate;
};
const disabledEndDateTime = (date) => {
if (!startDate) {
return {};
}
return {
disabledHours: () => getDisabledHours(startDate, date),
disabledMinutes: (hour) => getDisabledMinutes(hour, startDate, date),
disabledSeconds: (hour, minute) => getDisabledSeconds(hour, minute, startDate, date),
};
};
// 获取禁用的小时(基于第一个日期选择器的选择)
const getDisabledHours = (selectedDate, date) => {
if (!selectedDate || !selectedDate.isSame(moment(), 'day') || date > selectedDate) {
return [];
}
const now = moment();
return Array.from({ length: now.hour() }, (_, i) => i);
};
// 获取禁用的分钟(基于第一个日期选择器的选择)
const getDisabledMinutes = (hour, selectedDate, date) => {
if (!selectedDate || !selectedDate.isSame(moment(), 'day') || hour !== moment().hour() || date > selectedDate) {
return [];
}
const now = moment();
return Array.from({ length: now.minute() }, (_, i) => i);
};
// 获取禁用的秒数(基于第一个日期选择器的选择)
const getDisabledSeconds = (hour, minute, selectedDate, date) => {
if (
!selectedDate ||
!selectedDate.isSame(moment(), 'day') ||
hour !== moment().hour() ||
minute !== moment().minute() ||
date > selectedDate
) {
return [];
}
const now = moment();
return Array.from({ length: now.second() }, (_, i) => i);
};
return (
<Space direction= "vertical" size = { 12} >
<DatePicker
showTime
format = { 'YYYY-MM-DD HH:mm:ss' }
onChange = { handleStartDateChange }
disabledDate = { disabledStartDate }
disabledTime = { disabledStartDateTime }
/>
<DatePicker
showTime
allowClear
format = { 'YYYY-MM-DD HH:mm:ss' }
disabledDate = { disabledEndDate }
disabledTime = { disabledEndDateTime }
/>
</Space>
);
};
export default App;
请注意,在上面的代码中,假设正在使用 moment.js 进行日期处理。如果使用的 antd 版本已经不再依赖 moment.js,可以直接使用原生 JavaScript 的 Date 对象进行日期和时间的处理,并相应地调整代码中的日期处理逻辑。
此外,getDisabledHours, getDisabledMinutes, 和 getDisabledSeconds 方法是根据第一个 DatePicker 的选择来决定哪些时间点应该被禁用的。