如何计算多个时间范围(最佳会议时间)的交集?

时间:2016-01-13 23:00:20

标签: javascript

给出5个不同的时间:

10am - 6pm
3pm - 10pm
4pm - 7pm
5pm - 1am
3pm - 12am

是否有算法计算给定时间之间的最佳时间?比如平均时间?

我已尝试将每一方加起来并除以该方的次数,但问题出现在我尝试计算ampm的时间,所以有时会必须加权不同吗?像军事时间10pm = 22 / 12am = 24 /等等。

我还没有为此编码任何东西,因为我一直试图弄清楚这个方法,但它会用JavaScript编程。

编辑:

 6pm - 9pm
 3pm - 8pm
 4pm - 7pm
 2pm - 10pm
 5pm - 11pm

 *6 + 3 + 4 + 2 + 5 = 20 / 5 = 4
 *9 + 8 + 7 + 10 + 11 = 45 / 5 = 9

 *best time range = 4pm - 9pm

这是我所说的一个例子,它没有考虑am/pm

我希望找到一个最好的时间范围,给定五个时间范围。

2 个答案:

答案 0 :(得分:1)

如果你想知道所有持续时间的平均值,最简单的方法是先转换为24小时;考虑到日翻转,你可以在结束时间增加24小时,然后通过24获得MOD结果。

var timeRanges = [
    [10,18],
    [15,22],
    [16,19],
    [17,1],
    [10,18]
];

var durations = timeRanges.map(function(range){
    return ((range[1] + 24) - range[0]) % 24;
});

var totalDuration = durations.reduce(function(runningTotal, current){ 
     return runningTotal + current
}, 0);

var meanDuration = totalDuration / durations.length;

我不确定这是你在找什么,但这就是我解释你的问题的方法

答案 1 :(得分:0)

我会考虑使用moment.js和moment-range.js库,它们可以快速计算一个或多个日期范围的交集。

https://github.com/gf3/moment-range#contains--within--overlaps--intersect--add--subtract

但是,当您尝试查找多个时间范围的交集时,会出现无解的情况,因此您可能希望找到大多数时间范围内的时间(不是全部)。而且,实际上,人们可能有多个可用时间范围。

我建议创建一个包含日期时间对象的排序对象数组,无论它是开始还是结束,以及它的用途。然后,您可以遍历数组并在每个日期时间将可用人员添加/删除到数组上。如果您到达所有参与者都可用的时间,您会找到下一个结束时间,这是一个可能的会议时间 - 您可能有多个解决方案。

$icon-font-path: '/css/fonts/';

伪代码:

datesToCheck = [
 { date: yourDateObj, type: 'start', who: 'Juan' },
 { date: yourDateObj, type: 'end',   who: 'Juan' },
 { date: yourDateObj, type: 'start', who: 'Juan' },
 ...
]

我会留给你弄清楚如何获得该范围内的结束日期(提示:它可能不是列表中的下一个日期),以及如何决定选择哪个时间范围,如何存储多个可行的解决方案,并为每个人处理多个时间范围。