How to check time between range using javascript
I have the time value in HH:MM format. Hours are in 24 hours format. e.g. 14:30
I want to do a checking using two IF condition
- if the time value is between 05:00 to 22:00
- if the time value is between 22:00 to 05:00
I am not sure how to do that.
Since times in HH:mm format can be compared directly, you just need to compare the values. The following returns true if the time is in range, false otherwise.
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(' - '));
});
To provide more robust code, the input should be validated and cases over midnight should be considered.
Validation should limit hours to the range 00-23 and minutes to the range 00 to 59, e.g.
/^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$/.test(time)
If the start time is less than the end time, assume that the range doesn't go over midnight, e.g. 05:00 to 22:00. If the start is greater than the end, the range does go over midnight, so:
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}]`
));
If comparing strings doesn't suit, times can be reduced to a common unit, say minutes and then compared, e.g.
// 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}]`
));