Liczba dni roboczych
Liczenie ile minęło dni między jedną datą a drugą to dość częsty "problem" piszących w php. Samo policzenie dni bez rozróżniania na dni robocze jest banalnie proste:
2
3
echo (strtotime('2005-03-30 GMT')-strtotime('2005-03-01 GMT'))/86400;
?>
Jednak wyliczenie dni roboczych to już większa sprawa. By ułatwić sobie i Wam życie, napisałem funkcję, która wylicza liczbę dni roboczych. Pierwotnie funkcja nie uwzględniała świąt ruchomych jednak użytkownik kajko84 dopisał do tego i święta ruchome. Ja to trochę zoptymalizowałem i mamy w pełni funkcjonalną funkcję do wyliczania liczby roboczych.
Kod funkcji
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
function workDays($date1, $date2, $withStartDay = false) {
$date1=strtotime($date1);
$date2=strtotime($date2);
if ($date2===$date1 && !$withStartDay) return 0;
$char=1;
if ($date1>$date2)
{$datePom=$date1;$date1=$date2;$date2=$datePom;$char=-1;}
$count=0;
if (!$withStartDay)
$date1=strtotime('+1 day',$date1);
$date2=strtotime('+1 day',$date2);
$lastYear = null;
$hol=array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26');
while ($date1<$date2) {
$year = date('Y', $date1);
if ($year !== $lastYear){
$lastYear = $year;
$easter = date('m-d', easter_date($year));
$date = strtotime($year . '-' . $easter);
$easterSec = date('m-d', strtotime('+1 day', $date));
$cc = date('m-d', strtotime('+60 days', $date));
$hol[8] = $easter;
$hol[9] = $easterSec;
$hol[10] = $cc;
}
$weekDay=date('w',$date1);
if (!($weekDay==0 || $weekDay==6 || in_array(date('m-d',$date1),$hol)))
$count++;
$date1=strtotime('+1 day',$date1);
}
$count*=$char;
return $count;
}
?>
- $date1 - data początkowa w formacie rrrr-mm-dd
- $date2 - data końcowa w formacie rrrr-mm-dd
- $withStartDay - określa czy liczyć liczbę dni wraz z dniem początkowym. Domyślnie liczone jest bez tegoż dnia.
W przypadku, gdy data początkowo będzie większa od daty końcowej, dostaniemy wynik ujemny.
Użycie
Użycie funkcji jest banalnie proste:
2
3
4
5
6
echo workDays('2007-10-10','2007-10-12'); //wyświetli 2
echo workDays('2007-10-10','2007-10-14'); //wyświetli 2, gdyż dwa ostanie dni to weekend
echo workDays('2007-10-12','2007-10-10'); //wyświetli -2
echo workDays('2007-10-10','2007-10-12',true);//wyświetli 3, gdyż liczymy z dniem początkowym
?>


