代码之家  ›  专栏  ›  技术社区  ›  user8512043

筛选或检查日期范围中的日期

  •  0
  • user8512043  · 技术社区  · 6 年前

    这完全是一个简单或基本的要求。我试图从一个日期列表中使用 C# for 循环。我尝试将list函数分成两个范围,并从 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: - FromDate ToDate

     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 回复  |  直到 6 年前
        1
  •  2
  •   MBender    6 年前

    老实说,我有点搞不清你到底想干什么,我不禁觉得你的解决方案“过于工程化”。

    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 在特定的 日期范围 .

    编辑:

    在这种情况下,下面的代码应该有用。

    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);
    }
    

    .NET Fiddle 你的测试用例。注意,我仍然在使用 日期范围 类,为简洁起见,添加了构造函数。

    同时请注意 日期范围 类没有对start和end参数的健全性检查,可以创建 日期范围 与两个值相反(即start>end),这显然会导致错误。但这只是一个例子,所以我把这些事情的实现留给你。;)

        2
  •  1
  •   PiJei    6 年前

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

        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);
        }
    
    }
    
        3
  •  1
  •   Valeh Mikayilzadeh    6 年前
        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;
        }