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

获取日历显示的月份周数:2025年6月计算结果异常问题

问题分析

你的方法返回错误的核心原因有两点:

  1. GetWeekOfYear参数误用:调用该方法时,第三个参数应传入系统文化定义的一周起始日(如CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek),但你错误地传成了当月第一天的星期几,导致周数计算规则和日历显示逻辑不匹配。
  2. 周数计算逻辑缺陷:直接通过年份周数的差值计算行数,忽略了日历的展示规则——只要月份占了某一周块的一天,该周块就会作为单独一行显示。

以2025年6月为例:

  • 该月1日是周日,若日历以周一为起始日(多数中文系统默认),6月1日会和5月最后几天共占一行;
  • 30日是周一,单独占第六行;
  • 但你的方法因参数错误,用周日作为一周起始日计算周数,得出27-23+1=5,和实际显示的6行不符。
修正后的代码

以下是符合日历显示逻辑的实现,核心是按系统文化的周起始规则计算月份覆盖的总行数:

private static int GetWeeksInMonth(DateTime date)
{
    var culture = CultureInfo.CurrentCulture;
    DateTime firstDay = new(date.Year, date.Month, 1);
    DateTime lastDay = new(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
    DayOfWeek firstDayOfWeek = culture.DateTimeFormat.FirstDayOfWeek;
    
    // 计算当月第一天所在周的起始日
    DateTime startOfFirstWeek = firstDay.AddDays(-((int)firstDay.DayOfWeek - (int)firstDayOfWeek + 7) % 7);
    // 计算当月最后一天所在周的结束日
    DateTime endOfLastWeek = lastDay.AddDays((6 - (int)lastDay.DayOfWeek + (int)firstDayOfWeek + 7) % 7);
    
    // 计算覆盖的周行数
    return (int)(endOfLastWeek - startOfFirstWeek).TotalDays / 7 + 1;
}
验证效果

针对2025年6月(中文系统,一周起始日为周一):

  • 6月1日所在周的起始日是5月26日(周一);
  • 6月30日所在周的结束日是7月5日(周六);
  • 两个日期间隔40天,40/7=5,加1后得到6,完全匹配Outlook、MudBlazor的显示行数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:12:05