Een van de "rampen" die ik tegenkom is het uitrekenen van werkdagen.
Hieronder volgt een definitie van werkdagen die wij hanteren.
Onderstaanden code rekent werkdagen uit:
Zoals je ziet houd ik geen rekening met feestdagen etc, dit wordt echt te veel.
Of hebben jullie een leuke oplossing?
Nu vraag ik mij af of er geen betere manier is om werkdagen te berekenen.
Is er bijvoorbeeld niet een bepaald Calender object wat dit kan doen?
Wat is jullie gedachten over het berekenen van werkdagen?
Hieronder volgt een definitie van werkdagen die wij hanteren.
Als extra regel wordt er gesteld dat een werkdag van 00:00-24:00 loopt. Zonder deze regeling wordt het allemaal weer wat ingewikkelder.Artikel 3 van de Algemene Termijnenwet
• Algemeen erkende feestdagen in de zin van deze wet zijn: de Nieuwjaarsdag, de Christelijke tweede Paas- en
Pinksterdag, de beide Kerstdagen, de Hemelvaartsdag, de dag waarop de verjaardag van de Koning wordt gevierd
en de vijfde mei.
• Voor de toepassing van deze wet wordt de Goede Vrijdag met de in het vorige lid genoemde dagen gelijkgesteld
• Wij (red: de Koning) kunnen bepaalde dagen voor de toepassing van deze wet met de in het eerste lid genoemde
gelijkstellen. Ons besluit wordt in de Nederlandse Staatscourant openbaar gemaakt.
Onderstaanden code rekent werkdagen uit:
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
38
39
40
41
42
43
| rotected static double calculateWaitTime(DateTime startDate, DateTime stopDate){ double workDays = 0.0d; Console.WriteLine("START_DATE:"+startDate.ToLongDateString()+" "+startDate.ToLongTimeString()); Console.WriteLine("START_DATE:"+stopDate.ToLongDateString()+" "+stopDate.ToLongTimeString()); //Move startDate to Monday when it is a Saterday or Sunday if(startDate.DayOfWeek == DayOfWeek.Sunday) startDate = startDate.Add(new TimeSpan(1,-1*startDate.Hour,-1*startDate.Minute,-1*startDate.Second, -1*startDate.Millisecond)); else if (startDate.DayOfWeek == DayOfWeek.Saturday) startDate = startDate.Add(new TimeSpan(2,-1*startDate.Hour,-1*startDate.Minute,-1*startDate.Second, -1*startDate.Millisecond)); //Move stopDate to Monday when it is a Saterday or Sunday if(stopDate.DayOfWeek == DayOfWeek.Sunday) stopDate = stopDate.Add(new TimeSpan(1,-1*startDate.Hour,-1*startDate.Minute,-1*startDate.Second, -1*startDate.Millisecond)); else if (stopDate.DayOfWeek == DayOfWeek.Saturday) stopDate = stopDate.Add(new TimeSpan(2,-1*startDate.Hour,-1*startDate.Minute,-1*startDate.Second, -1*startDate.Millisecond)); Console.WriteLine("START_DATE:"+startDate.ToLongDateString()+" "+startDate.ToLongTimeString()); Console.WriteLine("START_DATE:"+stopDate.ToLongDateString()+" "+stopDate.ToLongTimeString()); //When startDate < stopDate switch dates for calculation DateTime tmp = stopDate; bool reverse = false; if(stopDate < startDate){ stopDate = startDate; startDate = tmp; reverse = true; } double days = (double)(stopDate.Ticks - startDate.Ticks)/TimeSpan.TicksPerDay; double wholeWeeks = Math.Floor(days / 7.0d); workDays += wholeWeeks * 5; workDays += days % 7; //When the stopDate weekday < startDate weekday distract an extre weekend if(((int)(stopDate.DayOfWeek+1)%7) < ((int)(startDate.DayOfWeek+1)%7)) workDays -= 2.0d; //When startDate < stopDate workdays is negative if(reverse) workDays *= -1; return workDays; } |
Zoals je ziet houd ik geen rekening met feestdagen etc, dit wordt echt te veel.
Of hebben jullie een leuke oplossing?
Nu vraag ik mij af of er geen betere manier is om werkdagen te berekenen.
Is er bijvoorbeeld niet een bepaald Calender object wat dit kan doen?
Wat is jullie gedachten over het berekenen van werkdagen?
[ Voor 8% gewijzigd door vinnux op 22-06-2005 13:21 ]