如何用JavaScript判断所选日期时间是否至少比当前时间晚3小时?
判断自定义格式日期是否晚于当前时间3小时的最优JS方案
嘿,这个场景我之前处理过不少,最优方案的核心其实是先可靠解析你的自定义日期格式,再做时间差比较——毕竟如果日期解析出问题,后面的判断全白搭。下面一步步给你拆解:
核心思路
- 把用户输入的
DD-MMM-YYYY hh:mmaa格式字符串,转换成JavaScript的Date对象(这是最关键的一步,因为原生Date.parse对这种非标准格式的兼容性很差); - 计算「当前时间 + 3小时」的时间节点;
- 比较输入日期是否大于等于这个时间节点。
具体实现代码
第一步:自定义日期解析函数
因为原生Date.parse可能在不同浏览器里对24-May-2018 05:45pm这种格式的解析结果不一致,所以我们自己写解析逻辑更可靠:
function parseCustomDate(dateStr) { // 定义月份缩写到数字的映射(Date对象的月份是0-11) const monthMap = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 }; // 用正则捕获日期时间的各个部分 const regex = /^(\d{2})-([A-Za-z]{3})-(\d{4}) (\d{1,2}):(\d{2})(am|pm)$/; const matches = dateStr.match(regex); if (!matches) { throw new Error('日期格式不正确,请输入类似"24-May-2018 05:45pm"的格式'); } const [, day, monthAbbr, year, hourStr, minuteStr, period] = matches; let hour = parseInt(hourStr, 10); const minute = parseInt(minuteStr, 10); // 处理12小时制转24小时制 if (period === 'pm') { hour = hour === 12 ? 12 : hour + 12; } else { hour = hour === 12 ? 0 : hour; } // 构造Date对象(注意月份要用映射后的数字) return new Date(year, monthMap[monthAbbr], day, hour, minute); }
第二步:判断时间差的函数
有了解析后的Date对象,剩下的就很简单了:
function isAtLeastThreeHoursLater(inputDateStr) { try { const inputDate = parseCustomDate(inputDateStr); const threeHoursFromNow = new Date(Date.now() + 3 * 60 * 60 * 1000); // 3小时的毫秒数 // 比较输入时间是否大于等于当前时间加3小时 return inputDate >= threeHoursFromNow; } catch (error) { console.error(error.message); return false; // 格式错误时返回false或者根据业务需求处理 } }
测试用例
你可以用这些例子验证:
// 当前时间加2小时,应该返回false console.log(isAtLeastThreeHoursLater('24-May-2018 07:45pm')); // 假设当前是2018-05-24 05:45pm // 当前时间加3小时,应该返回true console.log(isAtLeastThreeHoursLater('24-May-2018 08:45pm')); // 明天的同一时间,肯定返回true console.log(isAtLeastThreeHoursLater('25-May-2018 05:45pm'));
为什么这是最优方案?
- 兼容性强:自定义解析逻辑不受浏览器对
Date.parse的差异影响,能稳定处理你的格式; - 性能高效:没有引入第三方库,纯原生JS实现,解析和比较都是O(1)的操作;
- 可维护性好:逻辑清晰,拆分了解析和判断两个函数,后期如果格式变化,只需要修改解析函数即可。
内容的提问来源于stack exchange,提问作者Kenneth Hong
相关产品推荐
相关产品推荐

