如何将时间字符串转换为moment.js对象以调用.isBetween方法
错误原因
- 原生
Date对象和moment的默认解析逻辑都要求传入的参数包含完整的「年月日+时间」信息才能生成合法的时间实例,你只传入10:30 AM没有日期部分,解析器无法确定该时间对应的具体时间戳,因此会返回无效日期。 isBetween方法本身是对完整的moment时间对象做全维度比较,不支持仅传入时间参数做单独的时间部分判断,你之前的用法理解存在偏差。
解决方案
方案1:比较当天时间段
如果你的判断逻辑是针对当天的时间范围,可以手动拼接当前日期后再解析,同时建议显式指定解析格式避免不同环境的默认解析规则差异导致的异常:
const timeStr = '10:30 AM'; // 拼接当前日期生成完整时间字符串 const fullTimeStr = `${moment().format('YYYY-MM-DD')} ${timeStr}`; // 显式传入格式规则解析 const targetTime = moment(fullTimeStr, 'YYYY-MM-DD hh:mm A'); // isBetween调用示例:判断是否在当天9:00-12:00之间 const isInRange = targetTime.isBetween( moment(`${moment().format('YYYY-MM-DD')} 09:00 AM`, 'YYYY-MM-DD hh:mm A'), moment(`${moment().format('YYYY-MM-DD')} 12:00 PM`, 'YYYY-MM-DD hh:mm A') );
方案2:仅比较时间部分、忽略日期
如果你的判断逻辑不需要区分具体日期,只需要比较时间维度,可以给所有时间统一拼接同一个固定的合法日期,比较时日期部分完全一致,实际生效的就是时间维度的判断:
// 封装时间解析方法,统一拼接固定日期 const parseTimeOnly = (timeStr) => { return moment(`2000-01-01 ${timeStr}`, 'YYYY-MM-DD hh:mm A'); } const targetTime = parseTimeOnly('10:30 AM'); const startTime = parseTimeOnly('09:00 AM'); const endTime = parseTimeOnly('12:00 PM'); const isInRange = targetTime.isBetween(startTime, endTime);
内容的提问来源于stack exchange,提问作者webdesignnoob
相关产品推荐
相关产品推荐

