JS日期范围判断异常:2029年日期为何被误判为在2025封禁时段内?
问题:预订时间封禁判定逻辑错误排查
我有一组封禁时段数组,格式如下:
{ "blockedTimes": [ {"startTime": "1717228800", "endTime": "1719734400"}, {"startTime": "1719820800", "endTime": "1722412800"}, {"startTime": "1722499200", "endTime": "1725091200"}, {"startTime": "1725177600", "endTime": "1727683200"}, {"startTime": "1727769600", "endTime": "1730365200"}, {"startTime": "1730451600", "endTime": "1732957200"}, {"startTime": "1733043600", "endTime": "1735635600"}, {"startTime": "1735722000", "endTime": "1738314000"}, {"startTime": "1738400400", "endTime": "1740733200"}, {"startTime": "1740819600", "endTime": "1743408000"}, {"startTime": "1743517800", "endTime": "1746000000"}, {"startTime": "1746086400", "endTime": "1748678400"}, {"startTime": "1748764800", "endTime": "1751270400"}, {"startTime": "1751356800", "endTime": "1753948800"}, {"startTime": "1754035200", "endTime": "1756627200"}, {"startTime": "1756713600", "endTime": "1759219200"}, {"startTime": "1759305600", "endTime": "1761901200"}, {"startTime": "1761987600", "endTime": "1764469800"}, {"startTime": "1764579600", "endTime": "1767171600"}, {"startTime": "1767258000", "endTime": "1769850000"} ] }
我需要判断一段2029年的预订起止时间是否处于上述封禁时段内,编写了如下JS代码:
function epochToJsDate(ts) { // ts = epoch timestamp // returns date obj return new Date(ts * 1000); } for (let bt = 0; bt < rs.data.blockedTimes.length; bt++) { const range = rs.data.blockedTimes[bt]; const start = epochToJsDate(range.startTime).getTime() const end = epochToJsDate(range.endTime).getTime(); const bstart = new Date(parseInt(d.booking_info.start_date)).getTime(); const bend = new Date(parseInt(d.booking_info.end_date)).getTime(); if ((bstart > start) && (end <= bend)) { console.log('IN range') } else { console.log('not') } }
但运行后发现,2029年的预订时间被判定为处于封禁时段内,而所有封禁时段都在2025年,请问我的代码哪里出错了?
错误原因分析
你的条件判断逻辑完全搞反了:
当前判断条件(bstart > start) && (end <= bend)的含义是封禁时段的开始早于预订开始,且封禁时段的结束早于预订结束——对于2029年的预订来说,所有2025年的封禁时段都满足这个条件(2029的时间戳远大于2025),所以会错误输出IN range。
你需要根据实际需求调整判断逻辑:
- 如果要判断预订完全处于封禁时段内:
逻辑应为:预订开始时间 ≥ 封禁开始时间,且预订结束时间 ≤ 封禁结束时间if (bstart >= start && bend <= end) { console.log('IN range'); } - 如果要判断预订与封禁时段有任何重叠(更常见的场景):
逻辑应为:预订开始时间 < 封禁结束时间,且预订结束时间 > 封禁开始时间if (bstart < end && bend > start) { console.log('与封禁时段有重叠'); }
另外补充一个小问题:epochToJsDate函数中,传入的ts是字符串类型(JSON里的时间戳是字符串),虽然JS会自动隐式转换,但最好显式转为整数避免潜在问题,修改如下:
function epochToJsDate(ts) { return new Date(parseInt(ts) * 1000); }
内容的提问来源于stack exchange,提问作者reacter777
相关产品推荐
相关产品推荐

