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

React.js中如何校验startTime是否小于endTime?

12小时制时间大小校验方案(适配react-timekeeper组件)

实现原理

将react-timekeeper返回的带am/pm标识的12小时制时间字符串,统一转换为当日0点开始计算的总分钟数,直接比较数值大小即可完成校验。

具体实现步骤

  • 第一步:封装时间转分钟数的工具函数
// 入参为格式如"1:00 am"的12小时制时间字符串
const convertTimeToMinutes = (timeStr) => {
  const [timePart, period] = timeStr.split(' ');
  const [hours, minutes] = timePart.split(':').map(Number);
  let adjustedHours = hours;
  // pm时段12点不做累加,其余小时加12转为24小时制
  if (period.toLowerCase() === 'pm' && hours !== 12) {
    adjustedHours += 12;
  }
  // am时段12点对应24小时制的0点
  if (period.toLowerCase() === 'am' && hours === 12) {
    adjustedHours = 0;
  }
  // 返回当日总分钟数
  return adjustedHours * 60 + minutes;
}
  • 第二步:封装校验逻辑函数
// 入参为startTime和endTime两个12小时制时间字符串
const isEndTimeValid = (startTime, endTime) => {
  const startTotal = convertTimeToMinutes(startTime);
  const endTotal = convertTimeToMinutes(endTime);
  return endTotal > startTotal;
}
  • 第三步:在react-timekeeper的使用逻辑中调用校验
    react-timekeeper组件的onChange回调返回值中,formatted12字段就是标准的12小时制带am/pm的时间字符串,可直接拿来做校验,示例代码如下:
import { useState } from 'react';
import TimeKeeper from 'react-timekeeper';

const TimeSelect = () => {
  const [startTime, setStartTime] = useState('1:00 am');
  const [endTime, setEndTime] = useState('12:00 pm');
  const [timeError, setTimeError] = useState('');

  // 校验逻辑触发时机:结束时间变更、提交表单时都可以调用
  const checkTimeValid = () => {
    const valid = isEndTimeValid(startTime, endTime);
    setTimeError(valid ? '' : '结束时间必须晚于开始时间');
    return valid;
  }

  return (
    <div>
      <div>
        <label>开始时间</label>
        <TimeKeeper
          time={startTime}
          onChange={(val) => setStartTime(val.formatted12)}
        />
      </div>
      <div>
        <label>结束时间</label>
        <TimeKeeper
          time={endTime}
          onChange={(val) => {
            setEndTime(val.formatted12);
            // 结束时间变更时实时校验
            checkTimeValid();
          }}
        />
      </div>
      {timeError && <p style={{ color: 'red', fontSize: '14px' }}>{timeError}</p>}
      <button onClick={() => {
        if (checkTimeValid()) {
          // 校验通过后执行提交逻辑
          console.log('时间范围合法,提交数据');
        }
      }}>提交</button>
    </div>
  )
}

特殊场景说明

如果业务允许跨天选择时间(例如开始时间为22:00,结束时间为次日02:00),可以在校验不通过时新增跨天标识判断,跨天场景下给结束时间的总分钟数加上1440(一天的总分钟数)后再和开始时间的总分钟数比较即可。

内容的提问来源于stack exchange,提问作者Riya Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:45:05