8

我有开始和结束时间以及日期。像这样

         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");
 }
4

2 回答 2

13

使用时间戳而不是 Date 对象以有效地比较范围。这对于数据库按时间戳进行索引也将更加有效。
如果您不知道时间跨度的日期对中哪个时间更早,那么您可以进行min检查max。但是,如果您确实知道哪个时间在之前和哪个之后,则不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
}
于 2013-06-28T10:21:56.620 回答
2

我有另一个解决方案,我们可以使用 Moment-range,它是 Moment.js 的插件

只需检查这个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
于 2015-01-01T09:49:10.073 回答