Zoek het dagnummer van de startdatum (0-6 dus) en reken daarmee de eerstvolgende woensdag uit. Bereken daarna het aantal weken tussen eerstvolgendewoensdag en einddatum et voila. Als je dus kunt volstaan met enkel het aantal onkom je zelfs an lussen.
Als je alle woensdagen wil hebben neem je de eerstvolgendewoensdag om een lus te beginnen, en while (currentdatum < einddatum) currentdatum.addDays(7) en die voeg je toe aan een list/array/whatever. Dan ontkom je niet aan lussen maar hoef je natuurlijk ook niet elke dag "af te gaan tasten" en kun je per 7 dagen (week) door de range raggen.
Even een snel opzetje gemaakt:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| static void Main(string[] args)
{
DateTime start = DateTime.Now.Date;
DateTime end = new DateTime(2010, 5, 30);
Console.WriteLine("Number of wednesdays between {0} and {1}: {2}", start, end, CalcDays(start, end, DayOfWeek.Wednesday));
Console.WriteLine("All tuesdays between {0} and {1}:", start, end);
foreach (DateTime d in GetDaysList(start, end, DayOfWeek.Tuesday))
Console.WriteLine(d);
}
/// <param name="start">The start of the range</param>
/// <param name="end">The end of the range</param>
/// <param name="day">The weekday to count</param>
/// <returns>Returns the number of times the specified weekday occurs between start and end date (inclusive!)</returns>
private static int CalcDays(DateTime start, DateTime end, DayOfWeek day)
{
DateTime firstdate = start.AddDays((int)((int)day - (int)start.DayOfWeek + 7) % 7);
return (int)Math.Ceiling((end - firstdate).TotalDays / 7) + (end.DayOfWeek == day ? 1 : 0);
}
/// <param name="start">The start of the range</param>
/// <param name="end">The end of the range</param>
/// <param name="day">The weekdays to return in the list</param>
/// <returns>Returns a list of dates of a specified day of week between a start and end date (inclusive!)</returns>
private static List<DateTime> GetDaysList(DateTime start, DateTime end, DayOfWeek day)
{
List<DateTime> results = new List<DateTime>();
DateTime current = start.AddDays((int)((int)day - (int)start.DayOfWeek + 7) % 7);
while (current < end)
{
results.Add(current);
current = current.AddDays(7);
}
return results;
} |
Output:
Number of wednesdays between 21-4-2010 and 30-5-2010: 6
All tuesdays between 21-4-2010 and 30-5-2010:
27-4-2010
4-5-2010
11-5-2010
18-5-2010
25-5-2010
[
Voor 77% gewijzigd door
RobIII op 21-04-2010 19:24
]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij