[C#] 某月的第n個星期w是幾號

得知2009/1/1為該月的第一個星期四…
200/1/8為第二個星期四…
以此類推…

當有人問你2009的1月第三個星期二是幾號…
平常你可以看日曆最快…
但這樣的東西要怎樣用程式去算出來…

這聽起來似乎很難…
因為每個月的起始都不同…
有可能會有的星期w會有五個…

先講算法…
首先要做的是先知道該月的1號是星期幾x…
算出第一個w是幾號…
判斷w是否大於等於x…
大於等於時…f=1+(w-x)
小於時…f=1+[(7-x)+w)]
此時f就是第一個星期w的日期了…
再來就是看需要計算第幾個星期w…
ans=f+7*(n-1)

以下是程式…

1
2
3
4
5
6
7
8
9
10
11
12
13
DateTime firstDay = DateTime.Now.AddDays(-(DateTime.Now.Day - 1));
DayOfWeek queryDay = DayOfWeek.Tuesday;
DateTime firstWeek, ans;
int week = 3;
if ((int)queryDay >= (int)firstDay.DayOfWeek)
{
firstWeek = firstDay.AddDays((int)queryDay - (int)firstDay.DayOfWeek);
}
else
{
firstWeek = firstDay.AddDays(7 - (int)firstDay.DayOfWeek + (int)queryDay);
}
ans = firstWeek.AddDays(7 * (week - 1));

上面是在說從前面算起第n個星期w…
那我要算最後一個星期w呢…
算法改一下…
變成從月底來計算…

底下就直接看程式了…

1
2
3
4
5
6
7
8
9
DateTime lastDay = (firstDay.AddMonths(1)).AddDays(-1);
if ((int)lastDay.DayOfWeek >= (int)queryDay)
{
ans = lastDay.AddDays(-((int)lastDay.DayOfWeek - (int)queryDay));
}
else
{
ans = lastDay.AddDays(-(7 - (int)queryDay + (int)lastDay.DayOfWeek));
}