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

开发日历功能时首日为周日的月份首周被截断该如何解决?

问题原因

.NET 内置的DayOfWeek枚举规则为周日=0、周一=1、周六=6,而你的日历表头第一列为周一、最后一列为周日,两者的偏移规则不匹配,当月份第一天是周日时,偏移量计算错误直接跳过了1号;同时周数循环的判断条件写多了一位,会额外渲染一行空白行。

修改方案

只需要调整两个点即可修复问题:

  1. 调整首日偏移量的计算逻辑,周日的枚举值0改为7,匹配周一开头的表头规则,其余日期偏移量保持不变
  2. 把周循环的判断条件从w <= weeksInMonth改为w < weeksInMonth,避免多渲染空行

修复后完整代码

DateTime displayMonth = new DateTime(2021, 8, 1); // 后续可改为动态值
int firstDayOfWeek = (int)displayMonth.DayOfWeek;
// 适配周一开头的日历表头,把周日的偏移值从0改为7
int firstDay = firstDayOfWeek == 0 ? 7 : firstDayOfWeek;
int cellCounter = 0;
int daysInMonth = DateTime.DaysInMonth(displayMonth.Year, displayMonth.Month);
int weeksInMonth = (int)Math.Ceiling((double)(firstDay + daysInMonth) / 7);
// 修正循环条件,避免多余空行
for (var w = 0; w < weeksInMonth; w++)
{
    <div class="row">
        @for (var d = 0; d < 7; d++)
        {
            cellCounter++;
            <div class="col">
                @{
                    int day = 1 + cellCounter - firstDay;
                    if (day > 0 && day <= daysInMonth)
                    {
                        <h1>@day</h1>
                    }
                }
            </div>
        }
    </div>
}

修改后2021年8月的日历第一行最后一列(周日)会正常显示1号,前面6列为空,和后续日期衔接正常,不会再出现第一周截断的问题。

内容的提问来源于stack exchange,提问作者Stian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:15:03