给定一个日期范围列表,如何验证日期范围中的所有日期都包含在列表中

本文关键字:日期 范围 列表 包含 验证 一个 何验证 | 更新日期: 2023-09-27 17:50:53

我有一个日期范围列表。

05/01/2012 - 07/01/2012
07/02/2012 - 09/05/2012
01/01/2012 - 03/31/2012
08/01/2012 - 12/31/2012

现在的问题是验证给定列表是否涵盖了特定范围内的所有日期。例如,此列表涵盖2012年1月5日至2012年12月31日范围内的所有日期,但不包括2012年1月1日至2012年12月31日,因为4月份的日期不包括在此列表中。假设如下:

  1. 日期范围有效-开始日期<=结束日期。
  2. 日期范围可能重叠,如上述第2和第4的情况。
  3. 列表未按任何方式排序。

到目前为止,我所做的是测试异常值,如

查找最小的开始日期和最大的结束日期—如果测试日期范围的开始日期和/或结束日期分别小于/大于这些日期,则测试失败。

但是检查中间错过的日期的最佳策略是什么呢?提前感谢!

给定一个日期范围列表,如何验证日期范围中的所有日期都包含在列表中

最简单的策略是解析所有涉及的日期。O(N)

按起始日期对日期进行排序。O(N log N)时间

比较结束日期与下一个开始日期(忽略任何向后的结束日期)O(N)

如果一个结束日期到下一个开始日期超过一天,则存在空白

首先要做的是修复输入数据。

  1. 按开始日期订购所有范围
  2. 通过设置开始日期来删除所有重叠
  3. 消除任何因2
  4. 而消失的范围

那么范围就变成

01/01/2012 - 03/31/2012
05/01/2012 - 07/01/2012
07/02/2012 - 09/05/2012
09/06/2012 - 12/31/2012

那么你只需要找到缺失的日期,看看你是否能想出如何做到这一点。

将日期转换为自1970年1月1日(或其他参考日期)以来的天数。

那么你的问题就变成了找到缺失的整数

生成范围中的每个日期,将它们放在一个列表中,并测试您的候选人是否在该列表中。

尝试如下操作(按最小日期对列表范围进行排序后):-

  i=0
  a=min_date at 0 position
b=max_date corresponding to a
while list has elements
   c= min_date at (i+1) position
   d=max_date corresponding to c
if (b< (c - 1 day))
then there is a gap;
else 
{ 
if(b<d)   // done to handle the situation :- 06/07/2012 - 12/31/2012
          // 08/07/2012 - 11/31/2012. Then b will still remain 12/31/2012 after if condition
{
  b=d;
}
}
i=i+2;
end while;

以上将只查找列表中缺少的日期