过滤或检查日期范围内的日期

时间:2018-08-19 10:57:32

标签: c# .net winforms for-loop

这完全是一个简单或基本的要求。我正在尝试使用C#从日期列表中获取日期。因此,我完成了一个函数,并通过一个for循环对其进行了迭代。我试图将列表函数分为两个范围,并按如下方式从DatePicker控件传递值:

private void btnClick_Click(object sender, EventArgs e)
{
    DateTime theFromDate = dateTimePicker1.Value;
    DateTime theToDate = dateTimePicker2.Value;

    List<DateRange> lstRange = GetDateRange();

    /**Trying To Get The Date From The Range - Starts**/
    var dates = new List<DateTime>();

    for (var dt = theFromDate; dt <= theToDate; dt = dt.AddDays(1))
    {
        dates.Add(dt);
        //MessageBox.Show(dt.Date.ToString());
    }

    List<DateRange> lst = GetDateRange();
    foreach(var item in lst)
    {
        if(theFromDate <= item.EndtDate.Date)
        {
            MessageBox.Show(theFromDate.ToString("dd-MMM-yyyy") + " in the date range!");
        }
        else
        {
            MessageBox.Show(theFromDate.ToString("dd-MMM-yyyy") + " not in the date range!");
        }
    }
    /**Trying To Get The Date From The Range - Ends**/
}
public class DateRange
{
    public DateTime date { set; get; }
    public DateTime EndtDate { set; get; }
}

/**List of Dates Here - Starts**/
public List<DateRange> GetDateRange()
{
    List<DateRange> lstDate = new List<DateRange>();

    DateRange aDateRange = new DateRange();
    aDateRange.StartDate = Convert.ToDateTime("10-Aug-2018");
    aDateRange.EndtDate = Convert.ToDateTime("13-Aug-2018");
    lstDate.Add(aDateRange);

    return lstDate;
}
/**List of Dates Here - Ends**/

不幸的是,尽管列表有特定的日期,但是这没有返回期望的输出。

更新1: 预期输出-FromDateToDate的值存储在列表中。

 FromDate      ToDate 
 10-AUG-2018   13-AUG-2018

 **in the date range**

 FromDate      ToDate 
 13-AUG-2018   16-AUG-2018

 **in the date range** //As 13 is the end date in the given list

 FromDate      ToDate 
 8-AUG-2018    10-AUG-2018

 **in the date range** //As 10 is the start date in the given list

 FromDate      ToDate 
 8-AUG-2018    8-AUG-2018

 **not in the date range** //As 10 is the start date in the given list

3 个答案:

答案 0 :(得分:2)

老实说,我在弄清楚您要做什么的过程中遇到了麻烦,我不禁感到您在“过度设计”您的解决方案。

首先,“日期范围”只是两个日期-凝视日期和结束日期,但是您的GetDateRange方法内部有4个日期,并以列表的形式返回。这令人难以置信地令人困惑-而且我不确定您是要获取多个日期范围(多个对)还是单个日期范围。 鉴于所有日期都是一个接一个,所以我将假设后者。

public class DateRange
{
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

public DateRange GetStaticDateRange()
{
  //It seems counterproductive to add all 4 dates here, 
  //given that these are all one after the other
  return new DateRange
  { 
    StartDate = new DateTime(2018, 7, 10),
    EndDate = new DateTime(2018, 7, 13) 
  };
  //Obviously this can be modified as needed to return whatever combination of 
  //start-end dates you want, but this method will only ever return ONE range
  //However, this method could just as well accept parameters and / or access other resources
}

public bool IsInDateRange(DateTime dateToCheck, DateRange targetRange)
{
  //An argument can be made to use non-encompassing comparisons for both checks
  //depending on your requirements
  return dateToCheck >= targetRange.StartDate && dateToCheck <= targetRange.EndDate;
}

上面有一个用于存储“日期范围”(适当地称为DateRange)的简单类,以及一个示例方法,用于检查给定的DateTime在特定的{{1}内部是否有效}。

编辑:
好的,因此从您更新的问题中看来,您似乎正在尝试确定两个日期范围是否完全重叠。

在这种情况下,下面的代码应该有所帮助。

DateRange

这是.NET Fiddle上带有测试用例的有效示例。请注意,我仍在使用上面定义的public static bool DateRangesOverlap(DateRange range1, DateRange range2) { return (range1.StartDate >= range2.StartDate && range1.StartDate <= range2.EndDate) || (range1.EndDate >= range2.StartDate && range1.EndDate <= range2.EndDate); } 类,并添加了一个简洁的构造函数。

还请注意,DateRange类没有对start和end参数进行完整性检查,并且可以创建一个DateRange并颠倒两个值(即start> end),显然,会导致错误。但这只是一个示例,因此我将这些事情的实现留给您。 ;)

答案 1 :(得分:1)

您的代码中存在一些错误。 例如,在GetDateRange()中,您只向该范围添加了一个日期,其日期将设置为2018年8月13日,因此这是您需要解决的一件事,并且如果您的目标是在以下位置查找日期:一定日期范围内,您可以使用Linq。为了比较范围,我还建议使用DateTime.CompareTo方法。请参见下面的代码以更正您的错误:

    public static bool RangeContainsDate(DateTime queriedDateTime)
        {
            var queriedDateRange = new DateRange { Date = queriedDateTime };
            List<DateRange> dates = GetDateRange();
            return dates.Where(d => d.CompareTo(queriedDateRange) == 0).Any();
        }

        /**List of Dates Here - Starts**/
        public static List<DateRange> GetDateRange()
        {
            List<DateRange> lstDate = new List<DateRange>();

            DateRange aDateRange1 = new DateRange();
            aDateRange1.Date = Convert.ToDateTime("10-Aug-2018");
            lstDate.Add(aDateRange1);

            DateRange aDateRange2 = new DateRange();
            aDateRange2.Date = Convert.ToDateTime("11-Aug-2018");
            lstDate.Add(aDateRange2);

            DateRange aDateRange3 = new DateRange();
            aDateRange3.Date = Convert.ToDateTime("12-Aug-2018");
            lstDate.Add(aDateRange3);

            DateRange aDateRange4 = new DateRange();
            aDateRange4.Date = Convert.ToDateTime("13-Aug-2018");
            lstDate.Add(aDateRange4);

            return lstDate;
        }
    }
}

public class DateRange : IComparable<DateRange>
{
    public DateTime Date { set; get; }

    public int CompareTo(DateRange other)
    {
        if (ReferenceEquals(other, null))
        {
            return -1;
        }
        return DateTime.Compare(Date, other.Date);
    }

}

答案 2 :(得分:1)

    private void btnClick_Click(object sender, EventArgs e)
    {
        //DateTime theFromDate = dateTimePicker1.Value;
        DateTime theToDate = dateTimePicker2.Value;

        List<DateRange> lstRange1 = GetDateRange();
        List<DateRange> lstRange2 = GetDateRange();

        var result = lstRange1.Any(x => x.date >= theToDate && lstRange2.Any(y => y.date < theToDate));

        if (result)
        {
            MessageBox.Show(theToDate.ToString("dd-MMM-yyyy") + " in the date range!");
        }
        else
        {
            MessageBox.Show(theToDate.ToString("dd-MMM-yyyy") + " not in the date range!");
        }
    }



    public List<DateRange> GetDateRange()
    {
        List<DateRange> lstDate = new List<DateRange>();

        lstDate.Add(new DateRange { date = Convert.ToDateTime("10-Aug-2018") });
        lstDate.Add(new DateRange { date = Convert.ToDateTime("11-Aug-2018") });
        lstDate.Add(new DateRange { date = Convert.ToDateTime("12-Aug-2018") });
        lstDate.Add(new DateRange { date = Convert.ToDateTime("13-Aug-2018") });

        return lstDate;
    }