查找日期范围数组中的“漏洞”(间隙)

Dut*_*evv 6 javascript date momentjs

假设您有一系列日期范围

var arr = [
  {
    "from": 'unix 1st of august',
    "until": 'unix 5th of august'
  },
  {
    "from": 'unix 15th of august',
    "until": 'unix 20th of august'
  },
  {
    "from": 'unix 25th of august',
    "until": 'unix 31th of august'
  }
];
Run Code Online (Sandbox Code Playgroud)

在时间范围内找到“漏洞”的最简单方法是什么?在这种情况下,第 5 日到 15 日以及第 20 日到 25 日缺失。

function findDateRangeHoles() {
  let chunks = [];

  arr.forEach(range => {
     // ??
     chunks.push({from: '?', until: '?'});
  });

  // Return value example, array of object, each holding a missing date range chunk
  [
    {
        from: 'unix 5th of august',
        until: 'unix 15th of august'
    },
    {
        from: 'unix 20th of august',
        until: 'unix 25th of august'
    }
  ]

  return chunks;
}

let missingChunks = findDateRangeHoles(1st of August, 31 of August); // Array of objects
Run Code Online (Sandbox Code Playgroud)

不知道 momentjs 有什么用吗?

Jua*_*des 6

这是一个例子,但是以后,您应该发布真实的尝试,您发布的内容并不表明您已经尝试过。

对它们进行排序,并将范围 a 的末尾与范围 b 的开头进行比较(以数字形式表示)。执行此操作后,将您创建的起始日期和截止日期转换为日期范围

// Assuming they are sorted
var ranges = [{
  from: 946702800, // +new Date(2000, 0, 1) / 1000
  until: 949381200 // +new Date(2000, 1, 1)
},{
  from: 954565200,
  until: 957153600
},{
  from: 962424000,
  until: 965102400
}];

var holes = [];

for (var i=1; i < ranges.length; i++) {
  var beginningOfHole = ranges[i-1].until;
  var endOfHole = ranges[i].from;
  if (beginningOfHole < endOfHole) {
    holes.push({from: beginningOfHole + 1, until: endOfHole - 1});
  }
}

console.log('holes in ranges', holes.map(hole => ({
    from: new Date(hole.from * 1000), // Convert unix timestamp into JS timestamp
    until: new Date(hole.until * 1000)
})));
Run Code Online (Sandbox Code Playgroud)

  • @ConeteCristian 这就是为什么我说“对它们进行排序并比较最终范围......”。代码注释还提到“//假设它们已排序” (3认同)