You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:28:15