如何在javascript中检查时间范围

9
我有起始时间和结束时间,还有日期。就像这样:

我有起始时间和结束时间,还有日期。

         stime:1pm , etime:2pm , date:2/6/2013

我想将这个开始和结束时间存储到MongoDB中。因此,在保存这些详细信息之前,我应该检查该日期范围内是否存在这个时间段。
那么在JavaScript中如何做到呢?如何检查时间范围是否已经存在?
我已经尝试了这样做,但它没有正常工作。我甚至不知道我的方法是否正确或错误?
我希望任何人都能帮助我找到解决方案。
   var d0 = new Date("01/01/2001 " + "8:30 AM");
   var d1 = new Date("01/01/2001 " + "9:00 PM");
   var d2 = new Date("01/01/2001 " + "8:30 AM");
  var d3 = new Date("01/01/2001 " + "9:00 PM");
 if(d2<d0&&d3<=d0||d2<d1&&d3<=d3)
 {
      console.log("available");
 }else{
     console.log("not available");
 }

2
使用 moment.js(http://momentjs.com/) - Kersten
moment-range(https://github.com/gf3/moment-range)通过提供范围支持来扩展moment。 - h-kippo
2个回答

13

为了更有效地比较时间范围,建议使用时间戳而不是Date对象。同时,数据库按时间戳排序索引也会更加高效。
如果您不知道一对日期中哪个时间更早,则可以进行minmax检查。但是,如果您知道哪个时间在前面,哪个时间在后面,条件中就不需要minmax
下面的条件检查时间跨度是否重叠,这意味着即使第一个时间跨度的最后一秒与第二个时间跨度的第一秒重叠,它也将返回true
您可以执行其他检查以确定哪一个时间范围包含哪一个,但这是不同的条件。

// time of first timespan
var x = new Date('01/01/2001 8:30:00').getTime();
var y = new Date('01/01/2001 9:30:00').getTime();

// time of second timespan
var a = new Date('01/01/2001 8:54:00').getTime();
var b = new Date('01/01/2001 9:00:00').getTime();

if (Math.min(x, y) <= Math.max(a, b) && Math.max(x, y) >= Math.min(a, b)) {
    // between
}

但我有开始和结束时间要检查,而且你没有提到上午和下午。 - silvesterprabu
这是上面的一个例子,用来解决你的挑战。你可以使用任何有效的日期格式(带AM/PM或不带),只要它能够被JS正确解析为实际日期即可。在上面的例子中,x是开始,y是结束。此外,在上面的例子中,哪个日期是开始日期,哪个日期是结束日期并不重要。它们是两个日期,时间范围将从它们计算出来。在大多数情况下,这是一种常见的情况。 - moka
更新了问题,以反映实际上的问题,因为之前略有不同。 - moka

3
我有另一种解决方案,我们可以使用Moment.js的插件Moment-range。
请查看Moment Range
var start  = new Date(2012, 4, 1);
var end    = new Date(2012, 4, 23);
var lol    = new Date(2012, 4, 15);
var wat    = new Date(2012, 2, 27);
 var range  = moment().range(start, end);
 var range2 = moment().range(lol, wat);

 range.contains(lol); // true
 range.contains(wat); // false

嗨,专业人士,演示链接已失效。 - Ryan Nghiem
嗨@Ryan Nghiem,好的。但是从上面的帖子中,人们可以了解到moment range的工作原理,并且我也提供了一个小场景。如果链接失效并不意味着答案没有用。 - Sajjad Ali Khan
请问为什么有人说答案没用?首先您需要访问 Moment Range 的链接,然后您就能了解什么是 Moment Range,并且您可以看到我在上面定义的示例。 - Sajjad Ali Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接