C# 获取一个月的第一天到指定的星期和星期天之间的天数

C# 获取一个月的第一天到指定的星期和星期天之间的天数,c#,datetime,timespan,C#,Datetime,Timespan,我有以下问题:我试图计算实际月份和一周的第一天和他的一周之间的天数。 事实上,今天是二月。我会在这个月的第一天和第二个星期三之间休息。我怎样才能做到尽可能的干净呢?好吧,你可以像这样得到当月的第一天 DateTime firstDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); 你可以得到像这样的第二个星期三 DateTime secondWednesday = firstDay.AddDays(7); while(se

我有以下问题:我试图计算实际月份和一周的第一天和他的一周之间的天数。 事实上,今天是二月。我会在这个月的第一天和第二个星期三之间休息。我怎样才能做到尽可能的干净呢?

好吧,你可以像这样得到当月的第一天

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
。如果第一天是星期三,那么第二个星期三将是本月的第八天。除此之外,天数将大于
8

这是我能想象到的最符合逻辑的选择

我找到了一个很好的答案

语言不可知论版本:

要获得一个月的第一天,请从第一天开始 当月月份:yyyy-mm-01。使用任何可用的函数来提供 与一周中的某一天对应的编号。从中减去那个数字 你寻找的那一天;例如,如果 月是星期三(2),你要找星期五(4),减去2 从4点开始,剩下2点。如果答案是否定的,加7。最后再加上 到月初;以我为例,第一个星期五是 三号

要获取一个月的最后一个星期五,请查找下一个月的第一个星期五 一个月减去7天


下面是一个查找每月第一天的扩展方法:

public static DateTime FirstDayOfMonth(this DateTime datetime)
{
    return datetime.AddDays(-(datetime.Day - 1));
}
DateTime now = DateTime.Now;
DateTime firstWednesday = now.FirstDayOfMonth(DayOfWeek.Wednesday);
DateTime secondWednesday = firstWednesday.AddDays(7);

int difference = secondWednesday.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)
{
    return datetime.AddDays(-(datetime.Day - 1));
}
DateTime now = DateTime.Now;
DateTime firstWednesday = now.FirstDayOfMonth(DayOfWeek.Wednesday);
DateTime secondWednesday = firstWednesday.AddDays(7);

int difference = secondWednesday.Day - 1;

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

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

你有什么代码可以显示什么对你不起作用吗?我的大脑不起作用了。我不知道我怎么能练习这个。有人能给我一个提示吗?阅读关于CultureInfo.InvariantCulture.Calendar.GetWeekOfYear的文章。这是解决方案的一半。可能也很有趣。简单的方法是:从新的日期时间(年、月、1)开始,看看
DayOfWeek
是否是您想要的,如果是这样,增加find counter,添加一天,重复直到find counter是您想要的,并返回您添加的天数。