按日期查找月份的工作日

时间:2013-03-01 05:39:50

标签: c# datetime weekday

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

例如:如果我通过“2013年3月6日(2013年3月6日)”,该功能应该是月份的第1个星期三。 如果我通过“3/1/2013(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;
        }

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

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分:1)

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...

答案 2 :(得分:1)

我认为这很简单。如果某月中的某一天为17,则结果为1,如果月中的某一天为814,则为2 }, 等等。因此:

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

这是有效的,因为当操作数(被除数和除数)是整数时,定义除/的方式,参见/ Operator (C# Reference)