4 回答
TA贡献1851条经验 获得超5个赞
只需比较字符串即可
var shiftStartTime = "05:48"; var shiftEndTime = "14:29";
shiftStartTime > shiftEndTime // false
TA贡献1799条经验 获得超8个赞
好的,所以您得到了格式为字符串的三个相对时间HH:mm。我假设您的时间以 24 小时字符串/军事时间形式给出,因为否则,您需要 AM / PM 说明符。
将您正在使用的数据采用适合机器可读的格式总是很有用的,因此您可以将它们解析为将小时和分钟作为数字保存的简单对象。
执行此操作的函数可能如下所示。
function parseTimeStr(time) {
// The pattern of your input,
// allows spaces around the `:`
// and single-digit inputs like `8:00`
let re = /([0-9][0-9]?)\s*:\s*([0-9][0-9]?)/;
let result = re.exec(time.trim());
if (result === null) {
throw "No match"
}
let hour = parseInt(result[1], 10);
let minute = parseInt(result[2], 10);
/* handle out of range values here */
return { hour, minute };
}
好的,现在你已经有了这些对象了。你如何比较它们?有一个模式:让一个函数返回第一个参数是否大于 (1)、等于 (0) 还是小于 (-1) 第二个参数。
既然时间是一个对象,那么写这个就很简单了:
function cmpDate(date1, date2) {
if (date1.hour > date2.hour) {
return 1;
} else if (date1.hour < date2.hour) {
return -1;
} else if (date1.minute > date2.minute) {
return 1;
} else if (date1.minute < date2.minute) {
return -1;
} else {
return 0;
}
}
好吧,现在我们可以有一个辅助函数来检查第一个参数是否位于最后两个参数定义的闭区间内:
function isInShift(time, shiftStart, shiftEnd) {
// time is greater or equal shiftStart
// and less or equal shiftEnd
return cmpDate(time, shiftStart) !== -1 && cmpDate(time, shiftEnd) !== 1;
}
然后您最终可以通过调用进行比较isInShift(parseTimeStr(selectedTime), parseTimeStr(shiftStartTime), parseTimeStr(shiftEndTime))。这将返回一个布尔值。您可以轻松扩展此基础架构以实现多个轮班。
请注意,现实和您的用户都可能比您想象的更……扭曲。上面的代码没有对无效时间输入进行错误处理,也没有考虑夜班,但这些都是你可以轻松计算出来的细节,你只需要花点功夫去思考它们。
TA贡献1845条经验 获得超8个赞
const date = new Date();
const shiftStartTime = '05:48';
const shiftEndTime = '14:29';
const selectedDate = '14:20';
const start = date.setHours(+shiftStartTime.split(':')[0], +shiftStartTime.split(':')[1], 0, 0);
const end = date.setHours(+shiftEndTime.split(':')[0], +shiftEndTime.split(':')[1], 0, 0);
const selected = date.setHours(+selectedDate.split(':')[0], +selectedDate.split(':')[1], 0, 0);
if (start < selected && selected < end) {
console.log(true);
} else {
console.log(false);
}
TA贡献1798条经验 获得超7个赞
这里有一些 JS 可以做到这一点,尽管更好的格式时间会让它变得更容易
function findTotalTime(time) {
hours = parseInt(time.substring(0,2))
mins = parseInt(time.substring(3,5))
return (hours*60) + mins
}
startTime = findTotalTime(shiftStartTime)
endTime = findTotalTime(shiftEndTime)
selectedTime = findTotalTime(selectedDate)
if (selectedTime > startTime && selectedTime < endTime) {
// time is inbetween shifts
}
添加回答
举报