24小时制HH:mm格式控制台输入时间验证函数问题求助
修复时间验证函数的方案
原代码存在的问题
- 正则表达式限制过严:
/^\d{2}\:\d{2}$/要求小时和分钟必须是两位数字,导致5:01这类一位小时的输入被判定格式无效(如果你的需求允许一位小时/分钟,需要调整正则)。 - 错误调用字符串方法:
timeString是readline读取的字符串,不是Date对象,不存在getHour()和getMinutes()方法,这是抛出TypeError的核心原因。 - 数值校验逻辑错误:24小时制中0点(
00:00)是合法时间,原代码hour > 0会排除该情况;同理分钟0分也是合法的,minute > 0不符合要求。 - 函数无默认返回值:若格式校验通过但数值不合法,函数会返回
undefined,而非预期的false。
修复后的代码(两种可选方案)
方案1:严格遵循HH:mm格式(两位小时+两位分钟)
function isValidTime(timeString) { // 正则匹配两位数字小时:两位数字分钟,同时限制数值范围 const regexTime = /^([01]\d|2[0-3])\:[0-5]\d$/; // 校验格式并捕获匹配结果 const matchResult = timeString.match(regexTime); if (!matchResult) { return false; } // 拆分转换为数字(双重保障数值合法性) const [hourStr, minuteStr] = timeString.split(':'); const hour = parseInt(hourStr, 10); const minute = parseInt(minuteStr, 10); return hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59; }
此方案下,05:01合法,5:01会被判定无效,完全符合严格的HH:mm格式要求。
方案2:兼容一位小时/分钟(如5:01、05:1、5:1都算合法)
function isValidTime(timeString) { // 正则匹配1-2位数字小时:1-2位数字分钟,兼容一位输入 const regexTime = /^\d{1,2}\:\d{1,2}$/; if (!regexTime.test(timeString)) { return false; } // 拆分字符串并转换为数字 const [hourStr, minuteStr] = timeString.split(':'); const hour = parseInt(hourStr, 10); const minute = parseInt(minuteStr, 10); // 校验数值范围 return hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59; }
此方案下,5:01会被判定为有效时间,满足你输入该值时希望格式有效的需求。
补充说明
- 使用
parseInt(str, 10)确保按十进制转换数字,避免08这类字符串被意外解析为八进制。 - 方案1的正则已内置数值范围校验,后续的数值校验属于双重保障,可根据需求选择保留或省略。
内容的提问来源于stack exchange,提问作者HY2000
相关产品推荐
相关产品推荐

