给定约会天数,我尝试遍历一组约会(它们是包含startDate和endDate的对象),找出最快出现的x天,但没有预约(pendingStartDate)。尝试使用moment,但我不确定这是不是正确的(或最优雅的)路线。注意:我不仅仅是解决在所有约会之后获得第一个开放日的问题,因为在现有约会之间可以有开放日。
import Moment from 'moment';
import { extendMoment } from 'moment-range';
const moment = extendMoment(Moment);
const determineStartDate = (daysNeeded, existingAppts) => {
// this is about as far as I've gotten...
pendingStartDate = moment();
existingAppts.forEach((a) => {
range = moment.range(moment(a.startDate), moment(a.endDate);
console.log(range.contains(pendingStartDate));
})
}
// just some dummy code to help explain
const daysNeeded = 2
const existingAppts = [
{ startDate: '2020-06-15', endDate: '2020-06-17' },
{ startDate: '2020-06-14', endDate: '2020-06-14' },
]
const pendingStartDate = determineStartDate(daysNeeded, existingAppts);发布于 2020-06-12 06:42:27
如果你不想这样做,不需要使用moment ..可以使用javascript Date()。
existingAppts.sort(function(a, b) {
var aDate = new Date(a.endDate);
var bDate = new Date(b.endDate);
return (aDate - bDate);
});
daysNeeded = (daysNeeded > 0) ? daysNeeded - 1 : 0;
var apptFound = false;
var apptStart;
var apptEnd;
for(var index = 0; index < (existingAppts.length - 1) && !apptFound; index++){
apptStart = new Date(existingAppts[index].endDate);
apptStart.setDate(apptStart.getDate() + 1);
apptEnd = newDate();
apptEnd.setDate(apptStart.getDate() + daysNeeded);
var nextStart = newDate(existingAppts[index + 1].startDate);
if(apptEnd < nextStart){
apptFound = true;
}
}
if(!apptFound){
apptStart = newDate(existingAppts[existingAppts.length - 1].endDate);
apptStart.setDate(apptStart.getDate() + 1);
apptEnd = newDate();
apptEnd.setDate(apptStart.getDate() + daysNeeded);
}
existingAppts.push({startDate: apptStart, endDate: apptEnd});在您的determineStartDate函数中,首先按endDate对现有约会进行排序。然后循环你的约会..。新约会的潜在开始日期是当前约会结束后的一天。计算潜在的结束日期,并与列表中下一个约会的开始日期进行比较。如果有空间,则退出循环并将新约会设置到数组中。如果循环退出,但没有找到足够大的空位,则将约会安排在最后一次预约后的第二天(或客户希望的任何时候)。
发布于 2020-06-12 21:43:34
function determineStartDate(daysNeeded, existingAppts) {
// sort your existing appointments
const sortedAppointments = existingAppts.sort(function(a, b) {
var aDate = new Date(a.endDate);
var bDate = new Date(b.endDate);
return (aDate - bDate);
});
// potentialStartDate, start from today
let pStartDateInUTC = Date.now()
for (let appointment of sortedAppointments) {
const aStartDate = new Date(appointment['startDate'])
const aEndDate = new Date(appointment['endDate'])
// calculate potentialEndDate
let pEndDate = new Date(pStartDateInUTC + (daysNeeded-1) * 24 * 60 * 60 * 1000)
// if potentialEndDate is before the startDate
// of the current appointment,
// it is a valid solution
if (pEndDate < aStartDate) {
// match found!
break
}
// else, reset potential start date to
// day after current appointment's end date
pStartDateInUTC = (new Date()).setDate(aEndDate.getDate() + 1)
}
return new Date(pStartDateInUTC)
}https://stackoverflow.com/questions/62334322
复制相似问题