fix: incorrect range limitation on date fields with time (#7107)

This commit is contained in:
Katherine 2025-06-23 10:38:57 +08:00 committed by GitHub
parent bd900e9a92
commit a0181b58b1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -58,90 +58,98 @@ export const DatePicker = (props: any) => {
}, [props._maxDate, props._minDate, localVariables, parseVariable]); }, [props._maxDate, props._minDate, localVariables, parseVariable]);
const limitDate = async () => { const limitDate = async () => {
//dayjs()如果传入undefined可能会被解析成当前时间 // 直接将 UTC 时间字符串转换成 dayjs 对象(注意不转成本地时间)
let minDateTimePromise = props._minDate ? Promise.resolve(dayjs(props._minDate)) : Promise.resolve(null); let minDateTimePromise = props._minDate
? Promise.resolve(dayjs(props._minDate)) // 保持 UTC 时间
: Promise.resolve(null);
let maxDateTimePromise = props._maxDate ? Promise.resolve(dayjs(props._maxDate)) : Promise.resolve(null); let maxDateTimePromise = props._maxDate ? Promise.resolve(dayjs(props._maxDate)) : Promise.resolve(null);
if (isVariable(props._maxDate)) { if (isVariable(props._maxDate)) {
maxDateTimePromise = parseVariable(props._maxDate, localVariables).then((result) => { maxDateTimePromise = parseVariable(props._maxDate, localVariables).then((result) => {
console.log(dayjs(Array.isArray(result.value) ? last(result.value) : result.value));
return dayjs(Array.isArray(result.value) ? last(result.value) : result.value); return dayjs(Array.isArray(result.value) ? last(result.value) : result.value);
}); });
} }
if (isVariable(props._minDate)) { if (isVariable(props._minDate)) {
minDateTimePromise = parseVariable(props._minDate, localVariables).then((result) => { minDateTimePromise = parseVariable(props._minDate, localVariables).then((result) =>
return dayjs(Array.isArray(result.value) ? first(result.value) : result.value); dayjs(Array.isArray(result.value) ? first(result.value) : result.value),
}); );
} }
const [minDateTime, maxDateTime] = await Promise.all([minDateTimePromise, maxDateTimePromise]); const [minDateTime, maxDateTime] = await Promise.all([minDateTimePromise, maxDateTimePromise]);
const fullTimeArr = Array.from({ length: 60 }, (_, i) => i); const fullTimeArr = Array.from({ length: 60 }, (_, i) => i);
// 根据最小日期和最大日期限定日期时间 // disabledDate 只禁用日期,不要管时间部分
const disabledDate = (current) => { const disabledDate = (current) => {
if (!dayjs.isDayjs(current)) return false; if (!dayjs.isDayjs(current)) return false;
const currentDate = dayjs(current); // 把 current 转成本地时间(不加 .utc(),因为 current 就是本地时间)
const min = minDateTime ? dayjs(minDateTime) : null; // 然后和 maxDateTime同为本地时间做比较
const max = maxDateTime ? dayjs(maxDateTime).endOf('day') : null; // 设为 23:59:59 const min = minDateTime ? minDateTime.startOf('day') : null;
const max = maxDateTime ? maxDateTime.endOf('day') : null;
return (min && currentDate.isBefore(min, 'minute')) || (max && currentDate.isAfter(max, 'minute')); return (min && current.isBefore(min, 'day')) || (max && current.isAfter(max, 'day'));
}; };
// 禁用时分秒
const disabledTime = (current) => { const disabledTime = (current) => {
if (!current || (!minDateTime && !maxDateTime)) { if (!current || (!minDateTime && !maxDateTime)) {
return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [] }; return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [] };
} }
const currentDate = dayjs(current); // current 是本地时间,转成 UTC 时间
const isCurrentMinDay = currentDate.isSame(minDateTime, 'day'); const currentUtc = current.utc();
const isCurrentMaxDay = currentDate.isSame(maxDateTime, 'day');
// 判断是不是 minDate 和 maxDate 的同一天UTC
const isCurrentMinDay = minDateTime && currentUtc.isSame(minDateTime, 'day');
const isCurrentMaxDay = maxDateTime && currentUtc.isSame(maxDateTime, 'day');
const disabledHours = () => { const disabledHours = () => {
const hours = []; const hours = [];
if (isCurrentMinDay) { if (isCurrentMinDay) {
hours.push(...Array.from({ length: minDateTime.hour() }, (_, i) => i)); for (let h = 0; h < minDateTime.hour(); h++) {
hours.push(h);
}
} }
if (isCurrentMaxDay) { if (isCurrentMaxDay) {
hours.push(...Array.from({ length: 24 - maxDateTime.hour() }, (_, i) => i + maxDateTime.hour() + 1)); for (let h = maxDateTime.hour() + 1; h < 24; h++) {
hours.push(h);
}
} }
return hours; return hours;
}; };
const getDisabledMinutes = (selectedHour: number) => { const disabledMinutes = (selectedHour) => {
if (isCurrentMinDay && selectedHour === minDateTime.hour()) { if (isCurrentMinDay && selectedHour === minDateTime.hour()) {
return fullTimeArr.filter((i) => i < minDateTime.minute()); return fullTimeArr.filter((m) => m < minDateTime.minute());
} }
if (isCurrentMaxDay && selectedHour === maxDateTime.hour()) { if (isCurrentMaxDay && selectedHour === maxDateTime.hour()) {
return fullTimeArr.filter((i) => i > maxDateTime.minute()); return fullTimeArr.filter((m) => m > maxDateTime.minute());
} }
return []; return [];
}; };
const getDisabledSeconds = (selectedHour: number, selectedMinute: number) => { const disabledSeconds = (selectedHour, selectedMinute) => {
if (isCurrentMinDay && selectedHour === minDateTime.hour() && selectedMinute === minDateTime.minute()) { if (isCurrentMinDay && selectedHour === minDateTime.hour() && selectedMinute === minDateTime.minute()) {
return fullTimeArr.filter((i) => i < minDateTime.second()); return fullTimeArr.filter((s) => s < minDateTime.second());
} }
if (isCurrentMaxDay && selectedHour === maxDateTime.hour() && selectedMinute === maxDateTime.minute()) { if (isCurrentMaxDay && selectedHour === maxDateTime.hour() && selectedMinute === maxDateTime.minute()) {
return fullTimeArr.filter((i) => i > maxDateTime.second()); return fullTimeArr.filter((s) => s > maxDateTime.second());
} }
return []; return [];
}; };
return { return {
disabledHours, disabledHours,
disabledMinutes: getDisabledMinutes, disabledMinutes,
disabledSeconds: getDisabledSeconds, disabledSeconds,
}; };
}; };
setDisabledDate(() => {
return disabledDate; setDisabledDate(() => disabledDate);
}); setDisabledTime(() => disabledTime);
setDisabledTime(() => {
return disabledTime;
});
}; };
const newProps = { const newProps = {
utc, utc,
...props, ...props,