【问题标题】:Find the weekday of month by date按日期查找月份的星期几
【发布时间】:2013-02-15 13:45:21
【问题描述】:

我试图通过在 C# 中传递一个日期来查找每月的工作日数。

例如:如果我通过“2013 年 3 月 6 日(2013 年 3 月 6 日)”,该函数应该显示每月的第一个星期三。 如果我通过“2013 年 3 月 1 日(2013 年 3 月 1 日)”,该函数应该显示每月的第一个星期五。 如果我通过“2013 年 3 月 13 日(2013 年 3 月 13 日)”,该函数应该显示每月的第二个星期三。

我试图使用这个函数,但它返回了月份中的第几周(即传递“2013 年 3 月 6 日(2013 年 3 月 6 日)”返回 2):

public static int GetWeekOfMonth(DateTime date)
        {
            DateTime beginningOfMonth = new DateTime(date.Year, date.Month, 1);

            while (date.Date.AddDays(1).DayOfWeek != CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
                date = date.AddDays(1);

            return (int)Math.Truncate((double)date.Subtract(beginningOfMonth).TotalDays / 7f) + 1;
        }

请建议如何获取每月的工作日数。

【问题讨论】:

    标签: c# datetime weekday


    【解决方案1】:

    这是我快速拼凑的东西:

    public static int GetWeekOfMonth(DateTime dateTime)
    {
        DayOfWeek dayOfWeek = dateTime.DayOfWeek;
        DateTime dayStep = new DateTime(dateTime.Year, dateTime.Month, 1);
        int returnValue = 0;
    
        while (dayStep <= dateTime)
        {
            if (dayStep.DayOfWeek == dayOfWeek)
            {
                returnValue++;
            }
    
            dayStep = dayStep.AddDays(1);
        }
    
        return returnValue;
    }
    

    这里是同样的方法,只是它返回一个诸如“1st”、“2nd”、“3rd”等字符串,而不是一个简单的INT。序号基于 samjudson 在这篇文章中的代码:Is there an easy way to create ordinals in C#?

    public static string GetWeekOfMonth(DateTime dateTime)
    {
        DayOfWeek dayOfWeek = dateTime.DayOfWeek;
        DateTime dayStep = new DateTime(dateTime.Year, dateTime.Month, 1);
        int returnValue = 0;
    
        while (dayStep <= dateTime)
        {
            if (dayStep.DayOfWeek == dayOfWeek)
            {
                returnValue++;
            }
    
            dayStep = dayStep.AddDays(1);
        }
    
        switch (returnValue % 100)
        {
            case 11:
            case 12:
            case 13:
                return returnValue.ToString() + "th";
        }
    
        switch (returnValue % 10)
        {
            case 1:
                return returnValue.ToString() + "st";
            case 2:
                return returnValue.ToString() + "nd";
            case 3:
                return returnValue.ToString() + "rd";
            default:
                return returnValue.ToString() + "th";
        }
    }
    

    最后,这将返回“每月的第二个星期三”:

    DateTime dt = DateTime.Parse("2013-03-13");
    string dateString = string.Format("{0} {1} of month", GetWeekOfMonth(dt), dt.ToString("dddd"));
    

    【讨论】:

      【解决方案2】:
      public static int GetWeekOfMonth(DateTime date)
      {
        var weekDay = date.DayOfWeek;
        var nth = date.Day / 7;
        if (date.Day % 7 > 0)
        {
          nth++;
        }
        return nth;
      }
      

      编辑: var weekDay... 实际上不需要。

      【讨论】:

        【解决方案3】:

        我认为这真的很简单。如果月份的日期是17,则结果是1,如果月份的日期是814,则结果是2,以此类推。因此:

        public static int GetWeekOfMonth(DateTime date)
        {
            return (date.Day + 6) / 7;
        }
        

        这是因为当操作数(除数和除数)为整数时,除法 / 的定义方式,请参阅 / Operator (C# Reference)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          • 2018-07-14
          • 2021-06-29
          • 1970-01-01
          • 2019-06-30
          相关资源
          最近更新 更多