获取一个月的第一天与指定的一周和一周之间的天数

时间:2015-02-12 14:04:27

标签: c# datetime timespan

我遇到了以下问题:我尝试计算实际月份的第一天与一周和他的工作日之间的天数。 例如:实际上它是2月份。我将在这个月的第一天到第二个星期三之间的日子。我怎么能尽可能干净呢?

3 个答案:

答案 0 :(得分:1)

,您可以获得当月的第一天,如

DateTime firstDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);

你可以像第二个星期三那样获得;

DateTime secondWednesday = firstDay.AddDays(7);

while(secondWednesday.DayOfWeek != DayOfWeek.Wednesday)
{
   secondWednesday = secondWednesday.AddDays(1);
}

由于我们试图获得第二个星期三,在最坏的情况下,第二个星期三将是当月的8个数字。如果 1st 日是星期三,那么第二个星期三将是当月的第8个。除此之外,日期数将大于8

这是我至少可以想象的最合理的选择..

我在Mark Ransom上找到了this question的精彩答案;

  

与语言无关的版本:

     

要获得该月的第一天,请从第一天开始   本月:yyyy-mm-01。使用任何可用的功能来提供   对应于星期几的数字。从中减去那个数字   你正在寻找的那一天;例如,如果是第一天   月份是星期三(2),你正在寻找星期五(4),减去2   从4,离开2.如果答案是否定的,添加7.最后添加   到本月的第一天;就我而言,第一个星期五就是   第3次。

     

要获得本月的最后一个星期五,请找到下一个星期五   月减去7天。

答案 1 :(得分:0)

这是一种查找该月第一天的扩展方法:

public static DateTime FirstDayOfMonth(this DateTime datetime)
{
    return datetime.AddDays(-(datetime.Day - 1));
}

这是找到下一个工作日的人:

public static DateTime Next(this DateTime datetime, DayOfWeek day)
{
    return datetime.AddDays(datetime.DayOfWeek < day ?
        day - datetime.DayOfWeek :
        7 + day - datetime.DayOfWeek);
}

在这里找到一个月中任何一个工作日的第一个:

public static DateTime FirstDayOfMonth(this DateTime datetime, DayOfWeek day)
{
    DateTime first = datetime.FirstDayOfMonth();
    return first.DayOfWeek == day ? first : first.Next(day);
}

现在找到本月第一天之后的第二个星期三:

DateTime now = DateTime.Now;
DateTime firstWednesday = now.FirstDayOfMonth(DayOfWeek.Wednesday);
DateTime secondWednesday = firstWednesday.AddDays(7);

int difference = secondWednesday.Day - 1;

答案 2 :(得分:0)

这是一个没有循环或条件的解决方案:

DateTime NthWeekdayInCurrentMonth(int n, DayOfWeek day)
{
    var firstOfMonth = DateTime.Now.AddDays(-(DateTime.Now.Day-1));
    var firstWeekDay = firstOfMonth.AddDays(day - firstOfMonth.DayOfWeek);
    var NthWeekDay = firstWeekDay.AddDays(7*(n-1));
}

您可能希望在n上添加一些边界检查,以确保您的结果始终在当月。

您可以轻松获得生成日期与本月第一天之间的天数,如下所示:

NthWeekdayInCurrentMonth(2, DayOfWeek.Wednesday).Day-1