设计一个算法,以任意一天为基准向后数,得到第一个星期一的日期。即,
输入 |
2010-6-14 星期一 |
2010-6-15 星期二 |
2010-6-16 星期三 |
2010-6-17 星期四 |
2010-6-18 星期五 |
2010-6-19 星期六 |
2010-6-20 星期日 |
输出 |
2010-6-21 星期一 |
2010-6-21 星期一 |
2010-6-21 星期一 |
2010-6-21 星期一 |
2010-6-21 星期一 |
2010-6-21 星期一 |
2010-6-21 星期一 |
而在C#中,星期几是用数字表示的,即
星期的汉字表示 |
一 |
二 |
三 |
四 |
五 |
六 |
日 |
C#中星期的数字表示 |
1 |
2 |
3 |
4 |
5 |
6 |
0 |
现在来考虑基准日期分别是星期一、二、三、四、五、六、日时,需要加几天才能得到下周星期一的日期。如下:
基准日期 |
星期一
1
|
星期二
2
|
星期三
3
|
星期四
4
|
星期五
5
|
星期六
6
|
星期日
0
|
加 |
7天 |
6 天 |
5 天 |
4 天 |
3 天 |
2 天 |
1 天 |
得到 |
星期一 |
星期一 |
星期一 |
星期一 |
星期一 |
星期一 |
星期一 |
可以看到星期一到星期六都比较有规律,1+7 = 8, 2+6 = 8, ……,但是,星期日很讨厌,偏偏是个特例。
能不能找到一种普遍地通用于基准日为任一天的规律呢?
加法不行,那看减法。换个角度,先不找下周一的日期,而是找本周一的日期,看怎么找呢?
也来分别考虑基准日期分别是星期一、二��三、四、五、六、日时,需要减去几天才能得到本周一的日期,如下:
基准日期 |
星期一
1
|
星期二
2
|
星期三
3
|
星期四
4
|
星期五
5
|
星期六
6
|
星期日
0
|
减 |
0 天 |
1 天 |
2 天 |
3 天 |
4 天 |
5 天 |
6 天 |
得到 |
星期一 |
星期一 |
星期一 |
星期一 |
星期一 |
星期一 |
星期一 |
哈,只要减去基准日期的前一天的星期数就可以了!
于是,最开始的问题,就可以分成两步走了。
1. 从任意基准日期,如星期x开始,加上7天,得到下周星期x的日期;
2. 再以下周星期x为基准,减去下周星期x前一天的星期数,即得到了下周星期一的日期!
以上算法,C#实现如下:
/// <summary>
/// 以 anchorDate 为基准日期,获取在它之后的第一个星期一的日期
/// </summary>
/// <param name="anchorDate"></param>
/// <returns></returns>
private DateTime GetDateOfNextMondy(DateTime anchorDate)
{
return anchorDate.AddDays(7).AddDays(-Convert.ToInt32(anchorDate.AddDays(6).DayOfWeek));
}