检查日期和时间范围之间是否有一个日期和时间

时间:2018-04-03 07:07:43

标签: javascript

我在这里尝试注册活动 2018年4月15日下午6点至晚上7点。

但是有些用户阻止了这个地方 从2018年4月10日到2018年4月18日,从下午4点到下午5点。

用户已从下午4点到下午5点阻止,不是从下午6点到下午7点

我需要使用纯JavaScript来确定给定的日期和时间是否在阻止的日期和时间之间。

这是我到目前为止所尝试的。它不允许注册它。

var blockedstartTime = new Date("2018","04","10","16","00","00").getTime();
var blockedendTime = new Date("2018","04","18","17","00","00").getTime();

var eventstartTime = new Date("2018","04","15","18","00","00").getTime();
var eventendTime = new Date("2018","04","15","19","00","00").getTime();

if(Math.min(blockedstartTime, blockedendTime) < Math.max(eventstartTime, 
eventendTime) && Math.max(blockedstartTime, blockedendTime) > 
Math.min(eventstartTime, eventendTime)) {
   console.log("Not Allow");
} else {
   console.log("Allow");
} 

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

以下代码块中的doesOverlap() function会检测start end的{​​{1}}和/或param是否与A重叠start {1}}和/或end param B

isAvailable() function returns false doesOverlap() returns true。{/ p>

有关详细信息,请参阅Array.prototype.some()

// Blocked times.
var blockedTimes = Array.from(new Array(9)).map(function(x, i) {
  return {
    start: new Date("2018","04",(10+i).toString(),"16","00","00"),
    end: new Date("2018","04",(10+i).toString(),"17","00","00")
  }
})

// Events.
var threeToFive = {
  start: new Date("2018","04","15","15","00","00"),
  end: new Date("2018","04","15","17","00","00")
}
var sixToSeven = {
  start: new Date("2018","04","15","18","00","00"),
  end: new Date("2018","04","15","19","00","00")
}

// Does overlap.
function doesOverlap(A, B) {
  if (A.start > B.start && A.end < B.end) {
    return 'A between B'
  } else if (A.start < B.start && A.end > B.end) {
    return 'A over B'
  } else if (A.start < B.start && A.end > B.start) {
    return 'A over B.start'
  } else if (A.start < B.end && A.end > B.end) {
    return 'A over B.end'
  }
  return false // No overlap.
}

// Is available.
function isAvailable(event, blockedTimes) {
  return !blockedTimes.some(function(time) {
    return doesOverlap(event, time)
  })
}

// Proof.
console.log('Apr 15 3-5pm time slot is available:', isAvailable(threeToFive, blockedTimes))
console.log('Apr 15 6-7pm time slot is available:', isAvailable(sixToSeven, blockedTimes))

答案 1 :(得分:0)

你的问题是第一个用户从第一个日期到最后一个日期只有一个小时 - 也就是每天16:00到17:00之间。

现在,当您想要分配时间时,您需要获取所有预留时间的列表。在您的情况下,两个不同日期之间没有简单的范围。

var blocks = []; 

blocks.push({
   start: new Date("2018","04","10","16","00","00").getTime(),
   end: new Date("2018","04","10","17","00","00").getTime(); 
});

blocks.push({
   start: new Date("2018","04","11","16","00","00").getTime(),
   end: new Date("2018","04","11","17","00","00").getTime(); 
});

我必须使用循环进行上述操作。

现在,您可以在此处测试给定范围是否与任何阻塞时间重叠。

   var eventstartTime = new Date("2018","04","15","18","00","00").getTime();
   var eventendTime = new Date("2018","04","15","19","00","00").getTime();

   blocks.forEach(function(aBlock){
       if ((eventstartTime > aBlock.start && eventstartTime < aBlock.end) || 
           (eventendTime > aBlock.start && eventendTime < aBlock.end)) 
          console.log('Not allowed')  
   })

它只会检查您的活动时间是否超过任何阻止时间。