我正在try 在给定的一天中获取第一个可用时间,可以是一小时或一个半小时(这将解释我在示例中所说的一个半小时是什么意思),而在特定的一天中,我有其他时间不可用.

示例1:

如果当前时间为上午8:45,且不可用时间在"上午7:00至8:00"+"上午10:00至11:00"之间,则第一个可用时间将为9:00

示例2:

如果当前时间是下午1:35,而不可用时间是在下午2:00到3:00之间,则第一个可用时间是下午3:30

示例3:

如果当前时间为晚上11:00,且不可用时间为"晚上11:30至1:00"+"下午1:30至2:00",则第一个可用时间为下午2:30

推荐答案

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

我们会从now加1分钟开始,然后遍历每个时隙,判断每个时隙是否与我们的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; }

Javascript相关问答推荐

如何在RTK上设置轮询,每24小时

无法在nextjs应用程序中通过id从mongoDB删除'

微软Edge编辑和重新发送未显示""

为什么当我解析一个promise时,输出处于挂起状态?

当作为表达式调用时,如何解析方法decorator 的签名?

当试图显示小部件时,使用者会出现JavaScript错误.

如何解决useState错误—setSelect Image不是函数''

如何从HTML对话框中检索单选项组的值?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

传递方法VS泛型对象VS事件特定对象

通过跳过某些元素的对象进行映射

React Refs不与高阶组件(HOC)中的动态生成组件一起工作

为什么我看到的是回复,而不是我的文档?

使用createBrowserRoutVS BrowserRouter的Reaction路由

如何在Reaction中清除输入字段

material UI自动完成全宽

在AgGrid中显示分组行的单元格值

ReactJS扫描线演示:多个曲面未同时更新的问题

如何将.jsx转换为.tsx