如何从fromdate&列表中获取日期范围要与另一个日期进行比较

时间:2015-07-02 07:57:08

标签: c# validation datetime

我有一系列日期,如下所示,

var dateList = new List<DatePrev>
{
    new DatePrev{ FromDate=new DateTime(2014,10,1), ToDate=new DateTime(2015,3,1)},
    new DatePrev{ FromDate=new DateTime(2013,2,1), ToDate=new DateTime(2013,10,1)},
    new DatePrev{ FromDate=new DateTime(2010,2,1), ToDate=new DateTime(2011,10,1)}
};

此列表用作查找列表。 我有一个搜索数据如下,

var newDate = new DatePrev { FromDate = new DateTime(2015, 2, 1), ToDate = new DateTime(2017, 5, 1) };

我想在dateList集合中搜索,以确定提供的newdate是否可以插入dateList并具有适当的日期范围。 由于提供的日期列表的日期早于datelist第一行的todate,因此不应允许插入。

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你正在寻找的方法是检查两个“日期跨度”是否重叠。

我,我自己,最近遇到了这样的问题,解决方案相当容易。

鉴于两个日期定义为:

  • 日期A与AstartAend
  • 日期B与BstartBend

您可以确定它们是否重叠: !(Aend < Bstart || Astart > Bend)

因此,您可以编写以下代码:

class DatePrev
{
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }

    public static bool Overlap(DatePrev dateA, DatePrev dateB)
    {
        return !(dateA.ToDate < dateB.FromDate || dateA.FromDate > dateB.ToDate);
    }
}

(...)

        var newDate = new DatePrev(); //specify from and to

        if (!dateList.Any(d => DatePrev.Overlap(d, newDate)))
            dateList.Add(newDate);

该代码假定DatePrev包含“理智”值 - 即ToDate > FromDate。此外,您可能需要调整条件,具体取决于您是将来自/结束日期视为包含还是排他(在需要时将< or >更改为<= or =>。)

答案 1 :(得分:0)

如果只有在已添加的日期范围与新的日期范围不重叠时才需要将newDate添加到现有列表中,您可以这样做:

 bool slotTaken = dateList.Any(x => (x.FromDate <= newDate.FromDate &&
                                     x.ToDate >= newDate.FromDate) ||
                                    (x.x.FromDate <= newDate.ToDate &&
                                     x.ToDate >= newDate.ToDate);

 if (!slotTaken) 
 {
     dateList.Add(newDate);
 }

请注意,对于范围结束的情况,比较条件可能会根据您的要求而改变。如果newDate.FromDatenewDate.ToDate等于存储的日期,则当前解决方案会拒绝新的时间间隔。这意味着,根据您的示例,new DatePrev { FromDate = new DateTime(2015, 3, 1), ToDate = new DateTime(2017, 5, 1) };会被拒绝。如果允许相等的日期,您只需删除比较中的=,但是您需要考虑两个结束日期相等的特殊情况(即已添加日期范围)。