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