首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在日期范围内查找可用的天数

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

Stack Overflow用户
提问于 2016-04-16 21:26:11
回答 2查看 181关注 0票数 2

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

示例:

代码语言:javascript
复制
[Date X]========================================[Date Y]
        [A]=====[A]        [B]=====[B][C]=====[C]
        [ Event A ][ Open ][ Event B ][ Event C ]

其中日期X和日期Y是事件发生的主要日期范围。A、B和C是已经安排好的活动。

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

示例2:

代码语言:javascript
复制
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");

我需要归还这样的东西:

代码语言:javascript
复制
var availableRangeStart = "04-07-2015";
var availableRangeEnd = "04-14-2016";

因为这些是主范围中不被“事件”范围重叠的日期。

确切地说,我想做的是:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-16 22:33:16

下面是一个从/返回到免费的周期的解决方案:

代码语言:javascript
复制
// Helper function
function addDays(date, days) {
    return new Date(date.getTime() + days * 24*60*60*1000);
}

// Main function
function gaps(period, events) {
    events = events.slice(0).filter(function (a) {
        // Exclude events which are outside the main period
        return a.to >= period.from && a.from <= period.to;
    }).sort(function (a, b) {
        // Sort events by their starting date
        return a.from - b.from;
    });
    var result = events.reduce(function (result, curr) {
        if (curr.from - result.free > 0) {
            // gap found
            result.gaps.push({
                from: result.free, 
                to:   addDays(curr.from, -1)
            });
        }
        if (curr.to - result.free >= 0) {
            // first free day is after this event
            result.free = addDays(curr.to, 1)
        }
        return result;
    }, { gaps: [], free: period.from } );
    // Potentially add gap between last event end period-end
    if (period.to - result.free >= 0) {
        result.gaps.push({
            from: result.free,
            to:   period.to
        });
    }
    return result.gaps;
}


// Sample data:

var period = {
    from: new Date('2016-01-01'),
    to: new Date('2016-12-31')
};

var events = [
    { from: new Date('2016-02-01'), to: new Date('2016-02-29') },
    { from: new Date('2016-03-01'), to: new Date('2016-03-15') },
    { from: new Date('2016-04-16'), to: new Date('2016-04-30') },
];

// Call to function
var res = gaps(period, events);

// Output in snippet
document.write('<pre>' + JSON.stringify(res, null, 4));

票数 1
EN

Stack Overflow用户

发布于 2016-04-16 22:15:14

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

代码语言:javascript
复制
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;
    }
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36669968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档