<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));
    }