You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS中minDate与maxDate校验需求:maxDate为minDate+5年

ReactJS 实现日期范围校验(今日至今日+5年)

1. 计算基础日期范围

首先算出minDate(今日)和maxDate(今日+5年),统一适配input[type="date"]要求的YYYY-MM-DD格式:

// 获取今日日期,转成YYYY-MM-DD格式
const getToday = () => {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, '0');
  const day = String(today.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
};

// 获取今日+5年的日期,转成YYYY-MM-DD格式
const getMaxDate = () => {
  const today = new Date();
  const maxDate = new Date(today);
  maxDate.setFullYear(today.getFullYear() + 5);
  const year = maxDate.getFullYear();
  const month = String(maxDate.getMonth() + 1).padStart(2, '0');
  const day = String(maxDate.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
};

// 初始化日期范围常量
const minDate = getToday();
const maxDate = getMaxDate();

2. 原生React受控组件校验

不用表单库的情况下,通过受控组件实现实时校验:

import { useState } from 'react';

function DatePicker() {
  const [selectedDate, setSelectedDate] = useState('');
  const [errorMessage, setErrorMessage] = useState('');

  const handleDateChange = (e) => {
    const value = e.target.value;
    setSelectedDate(value);

    // 实时校验逻辑
    if (!value) {
      setErrorMessage('');
      return;
    }
    if (value < minDate) {
      setErrorMessage('日期不能早于今日');
    } else if (value > maxDate) {
      setErrorMessage('日期不能晚于今日起5年后');
    } else {
      setErrorMessage('');
    }
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    // 提交前二次校验
    if (!selectedDate) {
      setErrorMessage('请选择日期');
      return;
    }
    if (selectedDate < minDate || selectedDate > maxDate) {
      setErrorMessage('日期超出允许范围');
      return;
    }
    // 校验通过,执行提交逻辑
    console.log('提交日期:', selectedDate);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="date"
        value={selectedDate}
        onChange={handleDateChange}
        min={minDate}
        max={maxDate}
      />
      {errorMessage && <p style={{ color: 'red' }}>{errorMessage}</p>}
      <button type="submit">提交</button>
    </form>
  );
}

export default DatePicker;

这里同时利用input原生min/max限制选择器范围,再配合自定义校验处理手动输入非法日期的情况。

3. React Hook Form 方案(简洁表单校验)

如果项目使用React Hook Form,可结合校验规则快速实现:

基础校验版

import { useForm } from 'react-hook-form';

function RHFDatePicker() {
  const { register, handleSubmit, formState: { errors } } = useForm();

  const onSubmit = (data) => {
    console.log('提交日期:', data.selectedDate);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input
        type="date"
        {...register('selectedDate', {
          required: '请选择日期',
          validate: (value) => {
            if (value < minDate) return '日期不能早于今日';
            if (value > maxDate) return '日期不能晚于今日起5年后';
            return true;
          }
        })}
        min={minDate}
        max={maxDate}
      />
      {errors.selectedDate && <p style={{ color: 'red' }}>{errors.selectedDate.message}</p>}
      <button type="submit">提交</button>
    </form>
  );
}

export default RHFDatePicker;

Yup Schema校验版(更规范的校验逻辑)

import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';

// 定义校验Schema
const dateSchema = yup.object().shape({
  selectedDate: yup.date()
    .required('请选择日期')
    .min(new Date(minDate), '日期不能早于今日')
    .max(new Date(maxDate), '日期不能晚于今日起5年后')
});

function YupDatePicker() {
  const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: yupResolver(dateSchema)
  });

  const onSubmit = (data) => {
    console.log('提交日期:', data.selectedDate);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input
        type="date"
        {...register('selectedDate')}
        min={minDate}
        max={maxDate}
      />
      {errors.selectedDate && <p style={{ color: 'red' }}>{errors.selectedDate.message}</p>}
      <button type="submit">提交</button>
    </form>
  );
}

注意事项

  • 格式统一:input[type="date"]的value是YYYY-MM-DD字符串,校验时确保格式一致避免出错
  • 时区处理:跨时区场景建议用UTC日期计算,避免本地时间偏差
  • 双重校验:原生min/max仅限制选择器,必须配合自定义校验覆盖手动输入的非法情况

内容的提问来源于stack exchange,提问作者Basil Mirza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:10:31