<p>设计一个算法,以任意一天为基准向后数,得到第一个星期一的日期。即,</p>
输入 | 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)); }