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

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。

你需要根据实际需求调整判断逻辑:

  1. 如果要判断预订完全处于封禁时段内:
    逻辑应为:预订开始时间 ≥ 封禁开始时间,且预订结束时间 ≤ 封禁结束时间
    if (bstart >= start && bend <= end) {
      console.log('IN range');
    }
    
  2. 如果要判断预订与封禁时段有任何重叠(更常见的场景):
    逻辑应为:预订开始时间 < 封禁结束时间,且预订结束时间 > 封禁开始时间
    if (bstart < end && bend > start) {
      console.log('与封禁时段有重叠');
    }
    

另外补充一个小问题:epochToJsDate函数中,传入的ts是字符串类型(JSON里的时间戳是字符串),虽然JS会自动隐式转换,但最好显式转为整数避免潜在问题,修改如下:

function epochToJsDate(ts) {
  return new Date(parseInt(ts) * 1000);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 04:32:34