如何在C# WinForm中用DateTime计算一年的周六周日天数(无循环)
在C# Windows Form中无循环遍历全年日期计算周六周日数量
实现思路
- 平年共365天、闰年共366天,全年必然包含52个完整星期,因此周六、周日的基础数量各为52天
- 计算当年剩余的1天(平年)或2天(闰年),判断这些额外天数是否为周六/周日,将符合条件的数量加到基础值上
- 借助
DateTime.IsLeapYear判断闰年,DateTime.DayOfWeek获取年初星期几,仅需检查最多2天即可完成计算,无需遍历全年
改进后的代码
private void button1_Click(object sender, EventArgs e) { if (!int.TryParse(textBox1.Text, out int inputYear)) { MessageBox.Show("请输入有效的年份!"); return; } DateTime startOfYear = new DateTime(inputYear, 1, 1); int totalDays = DateTime.IsLeapYear(inputYear) ? 366 : 365; int extraDays = totalDays % 7; // 平年返回1,闰年返回2 int baseCount = 52; int satCount = baseCount; int sunCount = baseCount; // 仅检查额外的1-2天,而非遍历全年 for (int i = 0; i < extraDays; i++) { DayOfWeek currentDay = startOfYear.AddDays(i).DayOfWeek; if (currentDay == DayOfWeek.Saturday) { satCount++; } else if (currentDay == DayOfWeek.Sunday) { sunCount++; } } MessageBox.Show($"周六:{satCount}天,周日:{sunCount}天"); }
代码说明
- 加入
int.TryParse做输入验证,避免非法输入导致程序报错 - 通过
DateTime.IsLeapYear快速确定全年天数,计算出仅需检查的额外天数(最多2天) - 仅循环1-2次即可完成额外天数的判断,相比原代码遍历365/366天,效率大幅提升
- 基础计数52来自于
52*7=364,这是全年完整覆盖的星期数,剩余天数只需单独判断
内容的提问来源于stack exchange,提问作者richiee_chen
相关产品推荐
相关产品推荐

