Javascript 查找日期范围内的可用天数

Javascript 查找日期范围内的可用天数,javascript,algorithm,date,Javascript,Algorithm,Date,假设有一个显示活动日期可用性的系统。我们有一个主要的日期范围,所有的活动都在这个范围内。事件本身也可以是日期范围 例如: [Date X]========================================[Date Y] [A]=====[A] [B]=====[B][C]=====[C] [ Event A ][ Open ][ Event B ][ Event C ] 其中,日期X和日期Y是事件发生的主要日期范围。A、B和C是已安

假设有一个显示活动日期可用性的系统。我们有一个主要的日期范围,所有的活动都在这个范围内。事件本身也可以是日期范围

例如:

[Date X]========================================[Date Y]
        [A]=====[A]        [B]=====[B][C]=====[C]
        [ Event A ][ Open ][ Event B ][ Event C ]
其中,日期X和日期Y是事件发生的主要日期范围。A、B和C是已安排的事件

如何有效地检索开放日期范围

例2:

var rangeStart = new Date("04-01-2016");
var rangeEnd = new Date("04-31-2016");

var eventAStart = new Date("04-01-2016");
var eventAEnd = new Date("04-06-2016");

var eventBStart = new Date("04-15-2016");
var eventBEnd = new Date("04-30-2016");
我需要返回如下内容:

var availableRangeStart = "04-07-2015";
var availableRangeEnd = "04-14-2016";
因为这些是主范围中的日期,没有被“事件”范围重叠

确切地说,我想做的是:


我的应用程序是一个旅行计划器,用户可以在其中设置旅行日期,然后向旅行中添加具有自己日期的不同目的地。(用户将于4月1日至4月30日前往欧洲,他们将于4月1日至4月6日在巴黎,然后于4月15日至4月30日在伦敦)。但用户从4月7日到4月14日没有任何计划。我试图返回这些日期,以便在它们添加新的目的地时,预先填充日期。

我只是给您一个算法,因为最终的实现取决于您的代码

var aprilAvailableDays = [true, true, true, etc...] // a boolean for each day

aprilEvents.forEach(function (event) {
    for (var i = event.startDay; i <= event.endDay; i++) {
        aprilAvailableDays[i] = false;
    }
});
var aprilAvailableDays=[true,true,true,etc..]//每天的布尔值
aprilEvents.forEach(函数(事件){

对于(var i=event.startDay;i,这里有一个从空闲时段返回的解决方案:

//Helper函数
函数addDays(日期,天){
返回新日期(Date.getTime()+天*24*60*60*1000);
}
//主要功能
职能差距(期间、事件){
events=events.slice(0).filter(函数a){
//排除主时段之外的事件
返回a.to>=period.from&&a.from 0){
//发现缺口
结果({
发件人:result.free,
收件人:addDays(当前自-1起)
});
}
if(curr.to-result.free>=0){
//第一个自由日是在此活动之后
result.free=addDays(curr.to,1)
}
返回结果;
},{gaps:[],free:period.from});
//可能会在最后一个事件结束期间结束之间增加间隙
如果(period.to-result.free>=0){
结果({
发件人:result.free,
到:句号
});
}
返回结果.gaps;
}
//样本数据:
风险值期间={
起始日期:新日期('2016-01-01'),
截止日期:新日期('2016-12-31')
};
var事件=[
{从:新日期('2016-02-01')到:新日期('2016-02-29'),
{从:新日期('2016-03-01')到:新日期('2016-03-15'),
{从:新日期('2016-04-16')到:新日期('2016-04-30'),
];
//调用函数
var res=缺口(期间、事件);
//以代码段形式输出

document.write(“”+JSON.stringify(res,null,4))我真的不明白你说的话mean@YehiaAwad对不起,我应该说得更清楚一些。假设4月份有3个计划的事件。事件A是4月1日至4月6日,事件B是4月15日至4月20日,事件C是4月21日至4月30日。我需要检索4月7日至4月14日(因为没有计划任何事件)@trincot我添加了一些代码示例。我不太关心格式和语法(如果它不能使问题更容易解决的话)我正在寻找相关的逻辑。我感谢你的帮助!事件可能会重叠。还有一次没有解释的否决票——人们应该写下为什么否决,以提高网站质量——而不仅仅是增加挫败感和产生猜测游戏。@cbronson感谢你的耐心和编辑。你的问题已经很好地描述了我发现这很有挑战性。我在下面贴了一个答案。希望它能帮助你!PS:我喜欢你的ASCII模式。:)最简单的解决方案通常也是最简单的。填充一个包含所有可用日期的数组,在输入每个日期时,如果该日期位于要添加的范围内,则将其标记为不可用。您可以在添加之前预先检查这些日期中是否有任何日期已被占用。简单而优雅。哇,我真的想过头了。非常感谢您的帮助P