antd日期时间选择datepicker使用两个分别作为开始时间、结束时间,设置禁用日期和时间点

        功能要求:使用两个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 的选择来决定哪些时间点应该被禁用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值