20

我正在尝试进行 IF 检查以查看 X 日期范围是否在 Y 日期范围之间。但它没有在正确的时间返回正确的真/假:

var startdate = new Date('06/06/2013');
var enddate = new Date('06/25/2013');
var startD = new Date('06/08/2013');
var endD = new Date('06/18/2013');

if(startD >= startdate || endD <= enddate) {
  return true;
} else {
  return false;
}

这行得通,但是如果我更改startdate06/09/2013和更改enddate06/17/2013它不再起作用,而它应该起作用。

如果startdatewas06/07/2013enddatewas ,它甚至应该工作06/15/2013,但不是。有什么想法吗?

4

4 回答 4

39

如果你试图检测完全遏制,那是相当容易的。(此外,您不需要显式return true/false,因为条件无论如何都是布尔值。只需返回它)

// Illustration:
//
// startdate                          enddate
// v                                        v
// #----------------------------------------#
//
//         #----------------------#
//         ^                      ^
//         startD              endD
return startD >= startdate && endD <= enddate;

重叠测试稍微复杂一些。true如果两个日期范围重叠,则无论顺序如何,都会返回以下内容。

// Need to account for the following special scenarios
//
// startdate     enddate
// v                v
// #----------------#
//
//         #----------------------#
//         ^                      ^
//         startD              endD
//
// or
//
//              startdate        enddate
//                 v                v
//                 #----------------#
//
//         #------------------#
//         ^                  ^
//       startD              endD
return (startD >= startdate && startD <= enddate) ||
       (startdate >= startD && startdate <= endD);

@Bergi 的答案可能更优雅,因为它只检查两个日期范围的开始/结束对。

于 2013-06-25T18:17:05.770 回答
23

要检查它们是否与任何日期重叠,请使用

if (endD >= startdate && startD <= enddate)

这相当于

if ( !(endD < startdate || startD > enddate)) // not one after the other
于 2013-06-25T18:16:51.613 回答
15

在您的示例中,新日期都在范围之外。

如果要检查日期范围之间是否有任何重叠,请使用:

return (endD >= startdate && startD <= enddate);
于 2013-06-25T18:14:12.580 回答
0

这是nodejs中的逻辑

    export const isDateOverlaped = (firstDateRange: { from: Date; to: Date }, secondDateRange: { from: Date; to: Date }) => {
  // f-from -----------f-to
  //          s-from -------------- s-to
  const overlappedEnd =
    firstDateRange.from <= secondDateRange.from && firstDateRange.to >= secondDateRange.from && firstDateRange.to <= secondDateRange.to

  // f-from ----------------------- f-to
  //          s-from --------- s-to
  const overlappedBetween = firstDateRange.from <= secondDateRange.from && firstDateRange.to >= secondDateRange.to

  //            f-from -----------f-to
  // s-from -------------- s-to
  const overlappedStart =
    firstDateRange.from >= secondDateRange.from && firstDateRange.from <= secondDateRange.to && firstDateRange.to >= secondDateRange.to

  return overlappedEnd || overlappedBetween || overlappedStart
}
于 2021-02-27T10:08:24.087 回答