重叠功能不适用于某些日期格式

时间:2019-09-01 16:36:57

标签: javascript date

当我使用YYYY-MM-DDTHH:MM:SSZ格式时,我用于检查两个日期范围是否重叠的功能不起作用

日期rent2book2的第二个示例具有相同的日期,但是时间不同,因此它不应检测到重叠

const rent = {
  start: new Date("2019-03-10"),
  end:   new Date("2019-03-14")
}

const book = {
  start: new Date("2019-03-15"),
  end:   new Date("2019-03-18"),
}

const rent2 = {
  start: new Date("2019-03-10T01:00:00Z"),
  end:   new Date("2019-03-14T10:00:00Z")
}

const book2 = {
  start: new Date("2019-03-10T12:00:00Z"),
  end:   new Date("2019-03-14T15:00:00Z"),
}

function isOverlapping(startOne, endOne, startTwo, endTwo) {

  startOne = startOne.getTime();
  startTwo = startTwo.getTime();
  endOne = endOne.getTime();
  endTwo = endTwo.getTime();

  return !(endOne <= startTwo || startOne >= endTwo);

}

console.log("First: ", isOverlapping(rent.start, rent.end, book.start, book.end));
console.log("Second: ", isOverlapping(rent2.start, rent2.end, book2.start, book2.end));

2 个答案:

答案 0 :(得分:0)

您的函数运行良好-randint()rent不重叠,而bookrent2确实重叠。

如果需要计算两个日期范围之间的实际重叠量,则可以使用以下函数:

book2

如果结果为非零-则存在重叠。

该公式假设一个范围完全包含在另一个范围内-因此它计算包含范围的长度,然后尝试减去包含范围的2个间隔(在左侧和右侧)查找重叠量的范围。如果左侧或右侧间隔结果均为负,则将它们的上限设置为0。

答案 1 :(得分:0)

它与时间本身无关。但是由于您的布尔翻转,它会变得有些棘手。

案例1

("2019-03-14" <= "2019-03-15" || "2019-03-10" >= "2019-03-18")

_____________true____________________________false____________

因为它是or =>返回true ...然后翻转到false

案例2

("2019-03-14T10:00:00Z" <= "2019-03-10T12:00:00Z") ______________________false_______________________

||

"2019-03-10T01:00:00Z" >= "2019-03-14T15:00:00Z")

______________________false_______________________

没有true,因此返回了false ...然后翻转到true


例如,我建议看一下该线程: Determine Whether Two Date Ranges Overlap