月曜日などの日を選択したいと思います。今、私はその月または2つの選択された日付の間にあるすべての月曜日の日付を取得したい(さらに良い)。例えば。
選択日: 月曜日
開始日: 3月1日
終了日: 4月30日
これにより、これら 2 つの日付の間にある 8 つの月曜日すべての日付を取得する必要があります。DropDownList やカレンダーなど、これを行うために必要なものを使用する準備が整いました。C#、Visual Studio 2010 を使用しています。
それは本当に単純なアルゴリズムです:
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;
}
これを試して
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