开发日历功能时首日为周日的月份首周被截断该如何解决?
问题原因
.NET 内置的DayOfWeek枚举规则为周日=0、周一=1、周六=6,而你的日历表头第一列为周一、最后一列为周日,两者的偏移规则不匹配,当月份第一天是周日时,偏移量计算错误直接跳过了1号;同时周数循环的判断条件写多了一位,会额外渲染一行空白行。
修改方案
只需要调整两个点即可修复问题:
- 调整首日偏移量的计算逻辑,周日的枚举值0改为7,匹配周一开头的表头规则,其余日期偏移量保持不变
- 把周循环的判断条件从
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
相关产品推荐
相关产品推荐

