给定日期范围列表,我如何验证列表中是否涵​​盖了日期范围内的所有日期?

时间:2013-01-07 20:36:55

标签: c# java date

我有一个日期范围列表。

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

现在的问题是验证给定列表是否涵盖特定范围内的所有日期。例如,此列表涵盖05/01/2012 - 12/31/2012范围内的所有日期,但非01/01 / 2012-12 / 31/2012,因为此列表中未包含4月日期。假设是,

  1. 日期范围有效 - 开始日期< =结束日期。
  2. 日期范围可能与上述第2和第4位的情况重叠。
  3. 列表未按任何方式排序。
  4. 到目前为止我所测试的是像

    这样的异常值
      

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

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

5 个答案:

答案 0 :(得分:3)

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

按开始日期对日期排序。 O(N log N)时间

将结束日期与下一个开始日期进行比较(忽略任何倒退的结束日期)O(N)

如果下一个开始日期结束的时间超过一天,则会有差距。

答案 1 :(得分:2)

要做的第一件事是修复输入数据。

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

    所以你的范围会变成

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

    然后你只需要找到缺失的日期,看看你是否可以弄清楚如何做到这一点。

答案 2 :(得分:0)

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

然后你的问题就会找到缺失的整数。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试类似下面的内容(按照最短日期对列表范围进行排序): -

  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;

以上内容只会在列表中找到任何缺失的日期。