【问题标题】:Calculate the Number of Mondays in a Month计算一个月的星期一数
【发布时间】:2014-04-29 00:54:44
【问题描述】:

我想计算一个月内的周数。

从第一个星期一开始的 2014 年 1 月的第一周是第 6 号。因此,一月有 4 周。 2014 年 3 月的第一周从第一个星期一开始是第三个。所以,3 月有 5 周。

我想知道从第一个星期一算起一个月有多少周,而不是第一天。

我该怎么做?

我有此代码,但它用于获取特定日期的月份周数。

public int GetWeekNumberOfMonth(DateTime date)
{
    date = date.Date;
    DateTime firstMonthDay = new DateTime(date.Year, date.Month, 1);
    DateTime firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
    if (firstMonthMonday > date)
    {
        firstMonthDay = firstMonthDay.AddMonths(-1);
        firstMonthMonday = firstMonthDay.AddDays((DayOfWeek.Monday + 7 - firstMonthDay.DayOfWeek) % 7);
    }
    return (date - firstMonthMonday).Days / 7 + 1;
}

【问题讨论】:

  • 所以你真的想要给定日历月的星期一数?
  • 你有什么代码可以给我们看
  • 我只想知道一个月有多少周,但从第一个星期一算起,而不是第一个日期。
  • @Enkhay:在什么情况下这与“每月的星期一数”不同? (至少这是一个更简单的计算概念。)

标签: c#


【解决方案1】:

试试这个:

获取当月的天数,求第一天。对于该月中的每一天,查看该天是否为星期一,如果是,则递增该值。

public static int MondaysInMonth(DateTime thisMonth)
{
    int mondays = 0;
    int month = thisMonth.Month;
    int year = thisMonth.Year;
    int daysThisMonth = DateTime.DaysInMonth(year, month);
    DateTime beginingOfThisMonth = new DateTime(year, month, 1);
    for (int i = 0; i < daysThisMonth; i++)
        if (beginingOfThisMonth.AddDays(i).DayOfWeek == DayOfWeek.Monday)
            mondays++;
    return mondays;
}

您可以将它与当前日期一起使用:

Console.WriteLine(MondaysInMonth(DateTime.Now));

输出: 4

或您选择的任何月份:

Console.WriteLine(MondaysInMonth(new DateTime(year, month, 1)))

【讨论】:

  • 谢谢,这就是我想要的,这段代码对我有用。非常感谢。
  • 没问题,很高兴我能帮上忙。
【解决方案2】:

只是更正西拉尔代码:

我必须从 0 开始,因为他正在使用 AddDays 方法。

原因:上面的例子返回 5 表示 NOV 和 4 表示 DEC 这是错误的..

编辑代码:

    public static int MondaysInMonth(DateTime thisMonth)
{
    int mondays = 0;
    int month = thisMonth.Month;
    int year = thisMonth.Year;
    int daysThisMonth = DateTime.DaysInMonth(year, month);
    DateTime beginingOfThisMonth = new DateTime(year, month, 1);
    for (int i = 0; i < daysThisMonth; i++)
        if (beginingOfThisMonth.AddDays(i).DayOfWeek == DayOfWeek.Monday)
            mondays++;
    return mondays;
}

【讨论】:

    【解决方案3】:

    我尝试使用该代码,但在某些情况下它不起作用。所以我在 MSDN 上找到了这段代码。

    public static int MondaysInMonth(this DateTime time)
        {
            //extract the month
            int daysInMonth = DateTime.DaysInMonth(time.Year, time.Month);
            var firstOfMonth = new DateTime(time.Year, time.Month, 1);
            //days of week starts by default as Sunday = 0
            var firstDayOfMonth = (int)firstOfMonth.DayOfWeek;
            var weeksInMonth = (int)Math.Ceiling((firstDayOfMonth + daysInMonth) / 7.0);
    
            return weeksInMonth;
        }
    

    我像扩展方法一样创建它,所以我可以这样使用:

    var dateTimeNow = DateTime.Now;
    var weeks = dateTimeNow.MondaysInMonth();
    

    【讨论】:

      【解决方案4】:

      没有循环的更快方法

      private static double GetDaysCount(DateTime sampleDate, int DayOfWeekToMatch)
      {
          int FirstDayOfMonth = (int)(new DateTime(sampleDate.Year, sampleDate.Month, 1).DayOfWeek);
      
          int FirstOccurrenceOn = 0;
      
          if (FirstDayOfMonth < DayOfWeekToMatch)
              FirstOccurrenceOn = DayOfWeekToMatch - FirstDayOfMonth + 1;
          else
              FirstOccurrenceOn = (7 - FirstDayOfMonth) + DayOfWeekToMatch + 1;
      
          int totalDays = DateTime.DaysInMonth(sampleDate.Year, sampleDate.Month);
      
          return Math.Ceiling((totalDays - FirstOccurrenceOn) / 7.0f);
      }
      

      【讨论】:

      • 乍一看,您可能错过了 ExpiryDate 的声明。我没有遇到这个表达式的库实例,这可能会使这个答案难以作为初学者使用。
      • 是的,我也没有注意到,该代码是从我早期的一个项目中复制而来的。我更新了更简洁的代码。
      猜你喜欢
      • 2014-05-10
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2015-03-21
      • 2018-04-06
      • 2021-07-26
      相关资源
      最近更新 更多