我正在尝试比较数组中的日期是否重叠但有问题。用户可以添加任意数量的日期,我需要检查它们以确保没有重叠。

日期数组(开始和结束日期之间用(-)组合:

dates (4) ["02/07/2018-02/07/2018", "02/05/2018-02/07/2018", "02/06/2018-02/06/2018", "02/08/2018-02/08/2018"]


我的代码:

        function CheckOverlappingDates(dates) {
        var startDate = [];
        var endDate = [];
        var isOverlap;
        for (var i = 0; i < dates.length; i++) {
            var split = dates[i].split('-');  // just split once
            startDate.push(new Date(split[0]).toLocaleDateString());
            endDate.push(new Date(split[1]).toLocaleDateString());

            for (var x = 0; x < startDate.length; x++) {
                if (startDate[x] >= startDate[x + 1] && startDate[x + 1] <= endDate[x + 1]) {
                    isOverlap = true;
                } else {
                    isOverlap = false;
                }
            }

        }

    }


我将它们分为开始日期和结束日期,如下所示

javascript - 数组中的日期范围比较-LMLPHP

但我的函数无法比较多个日期范围。

最佳答案

比较日期字符串时,可以将它们转换为Date对象,或者将其保留为字符串,并使用localeCompare。不要使用内置的日期解析器,因为它不可靠。 2行函数可以将格式设置为字符串或转换为日期,字符串可能会更有效,但由于日期较少的代码而比较。

要查看范围数组是否有重叠,需要将每个范围与其后的范围进行比较。由于已经完成,因此无需与这些对象进行核对。

目前尚不清楚重叠范围应如何处理,因此此函数仅返回“范围A与范围B重叠”的字符串数组。它还假设范围是包含范围的,因此02/05 / 2018-02 / 07/2018与02/07 / 2018-02 / 08/2018重叠。

例如



var dates = ["02/07/2018-02/07/2018", "02/05/2018-02/07/2018", "02/06/2018-02/06/2018", "02/08/2018-02/08/2018"];

// Assume array of ranges in format mm/dd/yyyy-mm/dd/yyyy
// Return array of overlapping ranges
function inRange(dates) {

  // Parse date string to Date
  function fn(s) {
    var b = s.split(/\D/);
    return new Date(b[2], b[0]-1, b[1]);
  }

  // Return true if range a overlaps range b
  // where range is string in format mm/dd/yyyy-mm/dd/yyyy
  // Overlaps if start or end of b are inside a, or
  // a is wholly inside b
  function overlaps(a, b) {
    a = a.split('-').map(fn);
    b = b.split('-').map(fn);
    return (b[0] >= a[0] && b[0] <= a[1]) || // b start in a
           (b[1] >= a[0] && b[1] <= a[1]) || // b end in a
           (b[0] <= a[0] && b[1] >= a[1]);   // b encloses a
  }

  // Array for overlapping ranges
  var overlappers = [];
  var max = dates.length - 1;

  dates.forEach(function(date, i) {

    // Don't test last as already tested
    if (i < max) {

      // Only test from this element to end of array
      for (var j = i+1; j <= max; j++) {

        // If overlaps, add to overlappers array
        if (overlaps(date, dates[j])) {
          overlappers.push(date + ' overlaps ' + dates[j]);
        }
      }
    }
  });
  return overlappers;
}

console.log(inRange(dates));





简单的解析器希望日期有效。如果需要检查它们,则解析器中需要额外的一行代码,并且需要在main函数中处理无效的日期。

关于javascript - 数组中的日期范围比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48625855/

10-11 23:03
查看更多