Xamarin/C# - 在日期范围内查找周末的方法。为啥我陷入循环并且无法增加当前日期?

Posted

技术标签:

【中文标题】Xamarin/C# - 在日期范围内查找周末的方法。为啥我陷入循环并且无法增加当前日期?【英文标题】:Xamarin/C# - Method to find weekends in a date range. Why am I stuck in loop and unable to increment current date?Xamarin/C# - 在日期范围内查找周末的方法。为什么我陷入循环并且无法增加当前日期? 【发布时间】:2021-11-26 11:45:46 【问题描述】:

问题:我的 Xamarin 项目中有一个页面,它接受两个用户输入的日期并检查该范围内的所有周六和周日,然后将所有这些日期添加到一个列表中,然后我可以计算并从一天的总数中扣除。当我运行第二个日期选择器时,屏幕将在大约一分钟后冻结并使应用程序崩溃。我的输出窗口给了我 LOS 溢出消息。当我在 'getWeekendCount()' 方法上设置断点时,我发现 AddDays(1) 方法没有增加 'date' 的值,并且似乎在循环同一日期,我认为这会导致溢出问题。

我不明白为什么会发生这种情况,希望能提供任何帮助。

public Calculator()
    
        InitializeComponent();
        
        //OnDateSelected(null, null);
        dateFrom.SetValue(DatePicker.MinimumDateProperty, DateTime.Now);
        dateTo.SetValue(DatePicker.MinimumDateProperty, DateTime.Now);
    

    public int getWeekendCount(DateTime a, DateTime b)
    
        List<DateTime> allDates = new List<DateTime>();
        Console.WriteLine("Date From: " + a.Date);
        Console.WriteLine("Date To: " + b.Date);
        for (DateTime date = a.Date; date <= b.Date; date.AddDays(1))
        
            if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)
            
                allDates.Add(date);
                Console.WriteLine(allDates);
            
        

        int weekendCount = allDates.Count();

        return weekendCount;
    
   
    void OnDateSelected(object sender, DateChangedEventArgs e)
    
        
        if(dateTo.Date < dateFrom.Date)
        
            leaveDaysLabel.Text = "Days: Invalid Selection";
        
        else if (dateTo.Date == dateFrom.Date)
        
            leaveDaysLabel.Text = "Days: 1";
        
        else
        
            Console.WriteLine("Date From: " + dateFrom.Date);
            Console.WriteLine("Date To: " + dateTo.Date);
            
            int count = getWeekendCount(dateFrom.Date, dateTo.Date);
            Console.WriteLine(count);

            int days = (dateTo.Date - dateFrom.Date).Days - count;

            leaveDaysLabel.Text = String.Format("Days: 0", days);

            leaveHoursLabel.Text = "Hours: " + (days * 7.4).ToString();
        

    

【问题讨论】:

【参考方案1】:

如果您检查AddDays 定义,您会发现它不会修改您的变量。只返回一个新日期。所以你的循环会永远持续下去

所以你应该改变你的循环。一个例子

    while(a.Date <= b.Date)
    
        if (a.DayOfWeek != DayOfWeek.Saturday && a.DayOfWeek != DayOfWeek.Sunday)
        
            allDates.Add(a);
            Console.WriteLine(allDates);
        
         a = a.AddDays(1);
    

另外,也许您应该只在a 日期调用WriteLine,而不是整个列表。或者在循环之后打印整个列表。

【讨论】:

或者在原来的for循环中,使用date = date.AddDays(1)

以上是关于Xamarin/C# - 在日期范围内查找周末的方法。为啥我陷入循环并且无法增加当前日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有周末的情况下获取日期范围之间的所有日期?

查找具有延期日期范围的行并累积其持续时间

pandas使用bdate_range函数获取起始时间(start)和结束时间(end)范围内的所有周末日期(weekends day)

jquery ui 多日期选择器数据范围没有周末

Laravel Eloquent 在 JSON 列中查找日期在某个范围内的所有记录

查找特定日期范围内每天的门票总数