使用 Moment Js 生成时隙
Generating Time Slots using Moment Js
我有这样结构的对象
var x = {
nextSlot: 30,
breakTime: [
['11:00', '14:00'], ['16:00', '18:00']
],
startTime: '8:00',
endTime: '20:00'
}
我想生成时隙,从 startTime 到 endTime。但我不想考虑时隙中的 breakTime。
输出应该是
['08:00','08:30','09:00','09:30','10:00','10:30','14:00','14:30','15:00','15:30', '17:30', '18:00', '18:30','19:00','19:30']
我实现了自己的逻辑。但这适用于长度为 1 的休息时间数组的 y。
// Check whether the startTime is less than endTime
while (moment(x.startTime, ['HH:mm']).format('HH:mm') < moment(x.endTime, ['HH:mm']).format('HH:mm')) {
for (let i = 0; i < x.breakTime.length; i++) {
// if startTime is greater then breakTime[i][0], and if starttime is less then breaktime[i][1],
//just add nextSlot to starttime
if (moment(x.startTime, ['HH:mm']).format('HH:mm') >= moment(x.breakTime[i][0], ['HH:mm']).format('HH:mm') && moment(x.startTime, ['HH:mm']).format('HH:mm') < moment(x.breakTime[i][1], ['HH:mm']).format('HH:mm')) {
x.startTime = moment(x.startTime, ['HH:mm']).add(x.nextSlot, 'm').format('HH:mm');
} else {
//otherwise, push the time to slot array and then increment it by nextSlot
slots.push(moment(x.startTime, ['HH:mm']).format('hh:mm'));
x.startTime = moment(x.startTime, ['HH:mm']).add(x.nextSlot, 'm').format('HH:mm');
}
}
}
如果我再向 breakTime
添加一个数组元素,这将不起作用。
像这样的东西应该可以工作:
var x = {
nextSlot: 30,
breakTime: [
['11:00', '14:00'], ['16:00', '18:00']
],
startTime: '8:00',
endTime: '20:00'
};
var slotTime = moment(x.startTime, "HH:mm");
var endTime = moment(x.endTime, "HH:mm");
function isInBreak(slotTime, breakTimes) {
return breakTimes.some((br) => {
return slotTime >= moment(br[0], "HH:mm") && slotTime < moment(br[1], "HH:mm");
});
}
let times = [];
while (slotTime < endTime)
{
if (!isInBreak(slotTime, x.breakTime)) {
times.push(slotTime.format("HH:mm"));
}
slotTime = slotTime.add(x.nextSlot, 'minutes');
}
console.log("Time slots: ", times);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>
我有这样结构的对象
var x = {
nextSlot: 30,
breakTime: [
['11:00', '14:00'], ['16:00', '18:00']
],
startTime: '8:00',
endTime: '20:00'
}
我想生成时隙,从 startTime 到 endTime。但我不想考虑时隙中的 breakTime。 输出应该是
['08:00','08:30','09:00','09:30','10:00','10:30','14:00','14:30','15:00','15:30', '17:30', '18:00', '18:30','19:00','19:30']
我实现了自己的逻辑。但这适用于长度为 1 的休息时间数组的 y。
// Check whether the startTime is less than endTime
while (moment(x.startTime, ['HH:mm']).format('HH:mm') < moment(x.endTime, ['HH:mm']).format('HH:mm')) {
for (let i = 0; i < x.breakTime.length; i++) {
// if startTime is greater then breakTime[i][0], and if starttime is less then breaktime[i][1],
//just add nextSlot to starttime
if (moment(x.startTime, ['HH:mm']).format('HH:mm') >= moment(x.breakTime[i][0], ['HH:mm']).format('HH:mm') && moment(x.startTime, ['HH:mm']).format('HH:mm') < moment(x.breakTime[i][1], ['HH:mm']).format('HH:mm')) {
x.startTime = moment(x.startTime, ['HH:mm']).add(x.nextSlot, 'm').format('HH:mm');
} else {
//otherwise, push the time to slot array and then increment it by nextSlot
slots.push(moment(x.startTime, ['HH:mm']).format('hh:mm'));
x.startTime = moment(x.startTime, ['HH:mm']).add(x.nextSlot, 'm').format('HH:mm');
}
}
}
如果我再向 breakTime
添加一个数组元素,这将不起作用。
像这样的东西应该可以工作:
var x = {
nextSlot: 30,
breakTime: [
['11:00', '14:00'], ['16:00', '18:00']
],
startTime: '8:00',
endTime: '20:00'
};
var slotTime = moment(x.startTime, "HH:mm");
var endTime = moment(x.endTime, "HH:mm");
function isInBreak(slotTime, breakTimes) {
return breakTimes.some((br) => {
return slotTime >= moment(br[0], "HH:mm") && slotTime < moment(br[1], "HH:mm");
});
}
let times = [];
while (slotTime < endTime)
{
if (!isInBreak(slotTime, x.breakTime)) {
times.push(slotTime.format("HH:mm"));
}
slotTime = slotTime.add(x.nextSlot, 'minutes');
}
console.log("Time slots: ", times);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>