C#首列为周六的月历视图代码日期显示错误,求修复方案
修复C#日历偏移量问题(列从周六开始)
你的问题确实出在偏移量计算逻辑上,当前的计算方向搞反了,导致日期列错位。以下是修复方案:
修复后的完整代码
int year = 2023; int month = 5; DateTime firstDayOfMonth = new DateTime(year, month, 1); int daysInMonth = DateTime.DaysInMonth(year, month); DayOfWeek firstDayOfWeek = firstDayOfMonth.DayOfWeek; // 修正偏移量计算逻辑 int offset = ((int)firstDayOfWeek - (int)DayOfWeek.Saturday + 7) % 7; Console.WriteLine(firstDayOfMonth.ToString("MMMM yyyy")); Console.WriteLine(); Console.WriteLine(" Sa Su Mo Tu We Th Fr"); for (int i = 0; i < offset; i++) { Console.Write(" "); } for (int day = 1; day <= daysInMonth; day++) { Console.Write($"{day,3}"); if ((offset + day) % 7 == 0) { Console.WriteLine(); } } if ((offset + daysInMonth) % 7 != 0) { Console.WriteLine(); }
问题原因解释
原代码中int offset = (int)DayOfWeek.Saturday - (int)firstDayOfWeek的逻辑是计算周六到当月第一天的反向差值,比如5月1日是周一(DayOfWeek.Monday = 1),计算得到6 - 1 = 5,这会在日期前添加5个空白,直接把周一推到了周四的列位。
修正后的公式((int)firstDayOfWeek - (int)DayOfWeek.Saturday + 7) % 7是计算当月第一天距离周六(日历第一列)的正向间隔:
- 若当月第一天是周六(
DayOfWeek.Saturday = 6),结果为(6-6+7)%7=0,无前置空白,直接显示在第一列 - 若当月第一天是周一(
DayOfWeek.Monday=1),结果为(1-6+7)%7=2,添加2个前置空白,正好对应表头的Mo列 - 加7再取模是为了避免出现负数结果(比如当第一天是周五时,
(5-6+7)%7=6,正确添加6个前置空白)
验证结果
修复后:
- 5月1日会正确显示在
Mo列 - 4月1日(周六)仍会正确显示在
Sa列,不影响原正确场景
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

