获取一天中第一个可用时间,该时间与一系列小时数不冲突



当我在javascript中有其他不可用的时间时,我正试图在给定的一天中获得第一个可用时间,无论是小时还是一个半小时(在一个例子中解释我所说的小时半是什么意思(。

示例#1:

如果当前时间是上午8:45并且不可用的小时在";上午7:00和上午8:00"+"上午10:00和上午11:00";第一个可用时间是上午9点。

示例#2:

如果当前时间是下午1点35分并且不可用的小时在";下午2:00和下午3:00";那么第一个可用时间是下午3:30

示例#3:

如果当前时间是晚上11点;晚上11:30和下午1:00"+"下午1点30分和2点";那么第一个可用时间是下午2:30

我建议创建一个函数getFirstAvailableTime()来搜索所需的时间。

我们从now加一分钟开始,然后遍历每个时隙,检查每个时隙是否与我们的unavailable时隙重叠。

如果它没有与不可用的时隙重叠,我们将其作为第一个可用时间返回。

function getFirstAvailableTime(now, unavailable, timeSlotSize = 30) {
// Start at the first available timeslot _after_ now. 
const start = Math.ceil((minutes(now) + 1) / timeSlotSize) * timeSlotSize;
for (let min = start; min < 1440; min += timeSlotSize) {
if (!unavailable.find(({ start, end }) => (min >= minutes(start) && min <= minutes(end)))) {
return { hour: Math.floor(min / 60), minute: min % 60 };
}
}
}
function minutes( { hour, minute }) {
return hour * 60 + minute;
}
function formatTime({ hour, minute }) { 
return [hour, minute].map(n => (n + '').padStart(2, '0')).join(':');
}
function formatSpan({ start, end }) { 
return [formatTime(start), formatTime(end)].join(' - ');
}
const inputs = [{ now: { hour: 8, minute: 45 }, unavailable: [{ start: { hour: 7, minute: 0}, end: { hour: 8, minute: 0} } ] },{ now: { hour: 13, minute: 35 }, unavailable: [{ start: { hour: 14, minute: 0}, end: { hour: 15, minute: 0} } ] },{ now: { hour: 11, minute: 0 }, unavailable: [{ start: { hour: 11, minute: 30}, end: { hour: 13, minute: 0} },{ start: { hour: 13, minute: 30}, end: { hour: 14, minute: 0} } ] } ]
console.log('Now'.padEnd(10, ' '), 'Unavailable'.padEnd(32, ' '), 'Next Slot');
for(let input of inputs) {
console.log(formatTime(input.now).padEnd(10, ' '), input.unavailable.map(formatSpan).join(', ').padEnd(32, ' '), formatTime(getFirstAvailableTime(input.now, input.unavailable)))
}
.as-console-wrapper { max-height: 100% !important; }

最新更新