当结束值小于start时,函数无法在start_time和end_time之间找到时间

时间:2018-02-10 05:12:01

标签: javascript node.js

我的功能如下所示:

function inTime(startTime, endTime) {
    function toMins(v) {
        v = v.split(':');
        return v[0] * 60 + +v[1];
    }

    const nowTime = new Date();
    startTime = new Date(+nowTime).setHours(0, toMins(startTime), 0, 0);
    endTime = new Date(+nowTime).setHours(0, toMins(endTime), 0, 0);
    return nowTime >= startTime && nowTime <= endTime;
}

startTime值小于endTime时,此功能可以正常工作。但是假设我的startTime18:30且我的endTime3:30nowTime2:30,那么它无法识别nowTime startTime 1}}介于endTimenpm install -g windows-build-tools之间。那么我该如何修改这个函数以便它可以覆盖这个测试用例呢?

2 个答案:

答案 0 :(得分:2)

如果endTime小于startTime,则必须在午夜左右包裹,因此请在endTime添加1天。然后,您需要使用||代替&&来比较当前时间(如果您在23:0002:00之间进行测试,那么您需要的是&#39} ;在23:0023:59之间或00:0002:00之间。

另一个问题是您将setHours()的返回值分配给变量。这将时间作为数字返回;我们需要将这些变量保留为Dates

&#13;
&#13;
function inTime(startTime, endTime) {
  function toMins(v) {
    v = v.split(':');
    return v[0] * 60 + +v[1];
  }

  const nowTime = new Date();
  var startMins = toMins(startTime);
  startTime = new Date(+nowTime);
  startTime.setHours(0, startMins, 0, 0);
  var endMins = toMins(endTime)
  endTime = new Date(+nowTime);
  endTime.setHours(0, endMins, 0, 0);
  if (endTime < startTime) {
    endTime.setDate(endTime.getDate() + 1);
    return nowTime > startTime || nowTime < endTime;
  } else {
    return nowTime >= startTime && nowTime <= endTime;
  }
}

console.log(inTime('23:00', '02:00'))
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可能需要结束或开始时间调整

....
if (startTime > endTime) {
  if (endTime < now) {
      endTime.setTime(endTime.getTime() + 86400000);
  } else {
    startTime.setTime(startTime.getTime() - 86400000);
  }
}
return now >= startTime && now <= endTime;

但是,由于将时间换了一天保证了相应的条件满意度,您可以以更简单的方式进行:

if (startTime > endTime) {
  if (endTime < now) {
      return now >= startTime;
      //Example: start: 1:30, now:18:30, end: 0:30 -> true
      //Example: start: 20:30, now:18:30, end: 0:30 -> false
  } else {
      return now <= endTime;
      //Example: start: 21:30, now:1:30, end: 20:30 -> true
      //Example: start: 21:30, now:21:00, end: 20:30 -> false
  }
}
return now >= startTime && now <= endTime;

然后,我们发现两个now <= endTime下的ifstartTime > endTimeendTime => now封闭if运算符的条件下非常简单,因此我们可以将其评估为< strong> true 获得以下内容。

if (startTime > endTime) {
      return (now <= endTime || now >= startTime);
}
return now >= startTime && now <= endTime;

似乎startTime > endTime仅在开始+结束时间条件组合中将&&更改为||: - )