【问题标题】:get nth weekday of month in C# [duplicate]在C#中获取每月的第n个工作日[重复]
【发布时间】:2010-07-19 19:47:05
【问题描述】:

可能重复:
How do I determine if a given date is Nth weekday of the month?

我如何获得每月的第 n 个工作日?

例如:

“2010 年 7 月”的第 2 个星期一 = 07/12/2010。

寻找类似的功能:

public DateTime GetNthWeekofMonth(DateTime date, int nthWeek, DayOfWeek dayofWeek)
{
//return the date of nth week of month
}

由上可知,函数的参数为​​("Any Date in July 2010", 2, Monday)。

【问题讨论】:

  • 不清楚您在这里期望什么输入和输出。请澄清。
  • 我添加了一个类似问题的答案,它返回一个 DateTime 列表,以防您在 stackoverflow.com/questions/288513/… 需要的不仅仅是一个 DateTime

标签: c# date dayofweek


【解决方案1】:

使用以下扩展方法:

public static class DateTimeExtensions
{
    ///<summary>Gets the first week day following a date.</summary>
    ///<param name="date">The date.</param>
    ///<param name="dayOfWeek">The day of week to return.</param>
    ///<returns>The first dayOfWeek day following date, or date if it is on dayOfWeek.</returns>
    public static DateTime Next(this DateTime date, DayOfWeek dayOfWeek) { 
        return date.AddDays((dayOfWeek < date.DayOfWeek ? 7 : 0) + dayOfWeek - date.DayOfWeek); 
    }
}

然后你就可以写了

new DateTime(2010, 07, 01).Next(DayOfWeek.Monday).AddDays((2 - 1) * 7);

或者,作为一个函数:

public DateTime GetNthWeekofMonth(DateTime date, int nthWeek, DayOfWeek dayOfWeek) {
    return date.Next(dayOfWeek).AddDays((nthWeek - 1) * 7);
}

(我需要减去一个,因为date.Next(dayOfWeek) 已经是那天的第一次出现)

【讨论】:

  • OP 没有指定如果第 n 天不再在所需的月份内会发生什么,但我觉得应该以某种方式验证输入。
  • @SLaks,感谢您的回答。 @0xA3,我还验证了输入,如果周数大于 4,我将得到该月的最后一周。
  • 出色的代码——谢谢!非常非常次要的一点...要在代码中使用...将最后一个函数“GetNthWeekofMonth”中的“dayofWeek”更改为 dayOfWeek...(大写“O”以匹配后面的行)。
  • 如果我这样做GetNthWeekofMonth(new DateTime(2010, 7, 30), 2, DayOfWeek.Monday),结果是 8/9/2010.. 2010 年 7 月 30 日星期一的第 2 周不是 7/12/2010?
  • 我将GetNthWeekOfMonth 的@SLaks 实现更改为以下,应该可以:return new DateTime(date.Year, date.Month, 1).Next(dayofWeek).AddDays((nthWeek - 1) * 7);
【解决方案2】:

一种可能的算法:

  1. 从每月 1 日开始。
  2. 一天一天向前,直到 你得到星期几 寻找。
  3. 将 (7 * N) 添加到您要到达的日期 获取您想要的日期。

【讨论】:

  • 代替步骤 (2),您可以只找到一周中的哪一天是第一天,然后将必要的天数添加到那一天。例如,如果第一个是星期二,您知道第一个星期一是第 7 个 (+6)。一般来说,如果你用 Monday = 1, Tuesday = 2, ... , Sunday = 7 定义你的日子,一个月的第一个 X 天的公式将是分段函数: X-Y+1 如果 X>Y 8- Y+X 如果 X
【解决方案3】:

可在此处找到副本:How do I determine if a given date is the Nth weekday of the month?

int d = date.Day; 
return date.DayOfWeek == dow && (d-1)/7 == (n-1); 

【讨论】:

  • 我没有投票,但这不是(更新的)问题的答案。
【解决方案4】:
IEnumerable<DateTime> WeekdaysFrom( DateTime start )
{
    DateTime weekday = start.Add( TimeSpan.FromDays(1) );
    while( weekday < DateTime.MaxValue.Subtract( TimeSpan.FromDays(1) ) )
    {
        while( weekday.DayOfWeek == DayOfWeek.Saturday || weekday.DayOfWeek == DayOfWeek.Sunday )
        {
            weekday.Add( TimeSpan.FromDays(1) );
        }
        yield return weekday;
    }
}

DateTime NthWeekday( DateTime month, int n )
{
    return WeekdaysFrom( new DateTime( month.year, month.month, 1 ) ).Skip(n-1).First();
}

【讨论】:

  • 这里完全不需要循环。
猜你喜欢
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
相关资源
最近更新 更多