【问题标题】:How to check time between range using javascript如何使用javascript检查范围之间的时间
【发布时间】:2022-01-16 11:41:52
【问题描述】:

我有 HH:MM 格式的时间值。时间采用 24 小时格式。 例如14:30

我想使用两个 IF 条件进行检查

  1. 如果时间值在 05:00 到 22:00 之间
  2. 如果时间值在 22:00 到 05:00 之间

我不知道该怎么做。

【问题讨论】:

标签: javascript date


【解决方案1】:

由于可以直接比较 HH:mm 格式的时间,因此您只需比较值即可。如果时间在范围内,则返回 true,否则返回 false。

var range = ['05:00','22:00'];

function isInRange(value, range) {
  return value >= range[0] && value <= range[1];
}

['04:59','08:30','23:15'].forEach(function(time) {
  console.log(time + ' is ' + (isInRange(time, range)? ' ':'not ') + 'in range');
});

// Alternatively
['04:59','23:15','08:30'].forEach(function(time) {
  var inRange = isInRange(time, range);
  console.log(time + ' is in range ' + (inRange? range : range.slice().reverse()).join(' - '));
});

为了提供更健壮的代码,应对输入进行验证,并考虑午夜的情况。

验证应将小时限制在 00-23 范围内,将分钟限制在 00 到 59 范围内,例如

/^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$/.test(time)

如果开始时间小于结束时间,则假设范围不超过午夜,例如05:00 至 22:00。如果开始大于结束,则范围确实会超过午夜,所以:

function isInRange(value, range) {
  let re = /^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$/;
  let [start, end] = range;
  // Validate values
  if ([value, start, end].some(value => !re.test(value))) {
    return;
  }

  // If start less than end, assume doesn't go over midnight
  if (start <= end) {
    return value >= start && value < end;
  
  // Otherwise, assume goes over midnight
  } else {
    return value >= start || value < end;
  }
}


// Range on same day midnight
let range = ['05:00', '22:00'];
['08:30','23:00','25:15'].forEach(value => {
  let inRange = isInRange(value, range);
  // Check returned value isn't undefined
  if (inRange === void 0) {
    console.log(`Invalid input: ${value}, [${range}]`);
  } else {
    console.log(`${value}: is ${inRange? '':'not'} in [${range}]`);
  }
});

// Range over midnight
range = ['22:00', '05:00'];
['08:30','23:00'].forEach(value => console.log(
 `${value}: is ${isInRange(value, range)? '':'not'} in [${range}]`
 ));

如果比较字符串不合适,可以将时间减少到一个通用单位,比如分钟,然后进行比较,例如

// Convert time in H:mm format to minutes
function timeToMins(time) {
  let re = /^(([0-1]?[0-9])|(2[0-3])):[0-5][0-9]$/;
  if (!re.test(time)) return;
  let [H, m] = time.split(':');
  return H * 60 + m * 1;
}

function isInRange(time, range) {
  // Input validation
  let re = /^(([0-1]?[0-9])|(2[0-3])):[0-5][0-9]$/;
  if ([time, ...range].some(time => !re.test(time))) {
    return;
  }
  // Convert times to minutes
  let [start, end] = range.map(time => timeToMins(time));
  time = timeToMins(time);

  // If start less than end, assume doesn't go over midnight
  if (start <= end) {
    return time >= start && time < end;

    // Otherwise, assume goes over midnight
  } else {
    return time >= start || time < end;
  }
}

// Range on same day midnight
let range = ['05:00', '22:00'];
['08:30', '23:00', '25:15'].forEach(value => {
  let inRange = isInRange(value, range);
  // Check returned value isn't undefined
  if (inRange === void 0) {
    console.log(`Invalid input: ${value}, [${range}]`);
  } else {
    console.log(`${value}: is ${inRange? '':'not'} in [${range}]`);
  }
});

// Range over midnight
range = ['22:00', '05:00'];
['08:30', '23:00'].forEach(value => console.log(
  `${value}: is ${isInRange(value, range)? '':'not'} in [${range}]`
));

【讨论】:

  • Attention: This is a faulty solution,至少在您需要比较超出“00:00”的值时。例如: isInRange("12:00", ['11:00', '02:00']) 当它应该为真时将返回 'false'。解释也是错误的:HH:mm format are not compared directly,它所做的只是比较字符串字符代码。例如:'12abc15' > '12abc00' 将返回 true,但不是因为它仅比较 'times' 字符代码。如果您需要一个真正的通用且经过实战考验的时间处理解决方案,请始终使用专门为它制作的库。
  • @Aerodynamic — 显然,延伸至午夜的范围的逻辑与不延伸的范围不同。答案提供了一种方法,而不是完整的解决方案。类似地,输入的验证是一个单独的问题,可以由调用者或被调用者实现。如果您想解决这些问题,请发布答案。 :-)
  • 嗨,罗伯。正如所指出的,您的代码可能在 OP 所述的特定约束(['05:00','22:00'])内工作。但是,正如 SO 上的人们必须寻找通用解决方案一样,我发现明确说明这不是一个通用解决方案很重要,您可以将其放入任何范围并且它会起作用。也许您可以在答案中注意到此方法的局限性,并可能纠正您隐含的比较的工作方式。 .我正在尝试自己弄清楚 00:00 的跨度,完成后可能会在此处发布。
  • 这不适用于像 ` ['23:00','02:00']` 这样的范围
  • @EugeneMala - 如果开始时间晚于结束时间,则假定范围超过午夜,因此 ['23:00','02:00'] 可以按预期工作,例如23:30 在范围内,03:00 不在范围内。例子包括在上面。如果要求使用不符合该标准的时间,则需要一个日期(或识别范围超过午夜的其他机制)。
【解决方案2】:

试试这个代码sn-p

function dateObj(d) {
    var parts = d.split(":"),
        date  = new Date();

    date.setHours(parts[0]);
    date.setMinutes(parts[1]);
    return date;
}
if(dateObj('02:35')>= dateObj('14:30')&& dateObj('14:30')<=dateObj('22:00'))alert('true');

【讨论】:

  • 你可以在这里实现自己的逻辑
  • 为什么需要创建一个Date对象?只需将 HH:MM 转换为分钟(或秒):parts[0]*60 + +parts[1].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2016-06-30
相关资源
最近更新 更多