-1

我想选择一天,比如星期一。现在我想获取该月或两个选定日期之间的所有星期一的日期(甚至更好)。例如。

选择日期:星期一

开始日期:3月1日

结束日期:4月30日

这必须让我知道这两个日期之间的所有 8 个星期一的日期。我准备好使用 DropDownList 或日历或任何必要的东西来做到这一点。我正在使用 C#、Visual Studio 2010。

4

2 回答 2

0

试试这个

DateTime d1 = DateTime.Parse("03/01/2013");
DateTime d2 = DateTime.Parse("04/01/2013");

int days = (d2 - d1).TotalDays;

for (i = 0; i <= days; i++) {
    DateTime d = d1.AddDays(i);
    if ((d.DayOfWeek == DayOfWeek.Monday)) {
        Console.WriteLine(d);   //dateList.Add(d);   <------ this could be a List<DateTime> or List<string>
    }
}

Output - M/dd/yyyy format
-------
3/04/2013
3/11/2013
3/18/2013
3/25/2013
4/01/2013
于 2013-03-02T08:33:14.223 回答
0

这是非常简单的算法:

    public static List<DateTime> GetDayOccurrences(DayOfWeek day, DateTime from, DateTime to)
    {
        var results = new List<DateTime>();

        while (from <= to)
        {
            if (from.DayOfWeek == day)
            {
                results.Add(from);
                from = from.AddDays(7);
            }
            else
            {
                from = from.AddDays(1);
            }

        }
        return results;
    }

为了让它更快一点,如果选择当前日期是星期几,我会向前移动 7 天。

以及该方法的用法:

        var from = new DateTime(2013, 3, 1);
        var to = new DateTime(2013, 4, 30);

        List<DateTime> mondays = GetDayOccurrences(DayOfWeek.Monday, from, to);

顺便说一句:2013 年 1 月 3 日至 2013 年 4 月 30 日之间有 9 个星期一:

2013-03-04
2013-03-11
2013-03-18
2013-03-25
2013-04-01
2013-04-08
2013-04-15
2013-04-22
2013-04-29

更新

也可以这样做,以删除if循环中的语句:

    public static List<DateTime> GetDayOccurrences(DayOfWeek day, DateTime from, DateTime to)
    {
        var results = new List<DateTime>();

        while(from <= to && from.DayOfWeek != day)
            from = from.AddDays(1);

        while (from <= to)
        {
            results.Add(from);
            from = from.AddDays(7);
        }

        return results;
    }
于 2013-03-02T08:42:22.810 回答