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

Javascript 如何计算多个时间范围的交集(最佳会议时间)?,javascript,Javascript,给定5个不同的时间: 10am - 6pm 3pm - 10pm 4pm - 7pm 5pm - 1am 3pm - 12am 是否有一个算法来计算这些给定时间之间的最佳时间?比如说平均时间 我尝试将每一方相加,然后除以该方的次数,但当我尝试计算该时间的am和pm时,问题就出现了,因此某些时间必须以不同的方式加权,对吗?比如军事时间,晚上10点=22/12点=24/等等 我还没有为此编写任何代码,因为我一直在试图找到解决这个问题的方法,但它将用JavaScript编程 编辑: 6pm - 9

给定5个不同的时间:

10am - 6pm
3pm - 10pm
4pm - 7pm
5pm - 1am
3pm - 12am
是否有一个算法来计算这些给定时间之间的最佳时间?比如说平均时间

我尝试将每一方相加,然后除以该方的次数,但当我尝试计算该时间的
am
pm
时,问题就出现了,因此某些时间必须以不同的方式加权,对吗?比如军事时间,晚上10点=22/12点=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


考虑到五个时间范围,我想找到一个最好的时间范围。

如果你想知道所有持续时间的平均值,最简单的方法是首先转换为24小时;要考虑到一天的滚动,您可以在结束时间的基础上增加24小时,然后在24小时前获得结果

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;

<>我不确定这是你要找的,但是这就是我如何解释你的问题

< P>我会考虑使用Simult.js和Simul-Rang.js库,它可以快速计算一个或多个日期范围的交集。

但是,当您试图找到多个时间范围的交集时,会出现没有解决方案的情况,因此您可能希望找到大多数时间(而不是所有时间)可以满足的时间。此外,现实中,人们可能有多个可用的时间范围

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

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

sort datesToCheck by date property;

for (i=0, i<datesToCheck.length, i++)
  date = datesToCheck[i]
  if date.type === 'start'
    availablePeopleSet.add(date.who)
  else
    availablePeopleSet.remove(date.who)
  if availablePeopleSet.size > mostAvailableFound
    mostAvailableFound = availablePeopleSet.size
    mostAvailableTimeStart = date;
排序日期按日期属性检查;
对于(i=0,我找到了最大可用性)
mostAvailableFound=availablePeopleSet.size
mostAvailableTimeStart=日期;

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

我不确定您所说的“5个不同时间的平均值”是什么意思,您拥有的是时间范围,而不是时间尝试计算时间差的平均值,例如上午10点-下午6点->8小时,下午3点-晚上10点->7小时…然后将小时数除以时段数。首先,您必须定义一组时间范围之间的平均值。您可以给出一个示例(如您所做的)告诉我们预期的结果是什么。现在你只是有一个不太明确的问题。也许你正在试图计算平均时间跨度或平均持续时间。你需要先将下午时间转换为军事时间;你还需要以不同的方式处理下午5点到凌晨1点的特殊情况。也许你想找到适合大多数时间范围的时间范围(因为其中一些时间范围根本不重叠)。那么,您是否正试图为具有给定可用性范围的会议找到“最佳时间”?