W tym wątku
http://forum.php.pl/index.php?showtopic=58...mp;#entry314580 podałem napisaną funkcję liczącą którym dniem
pracującym w roku jest podany dzień. Poniżej ta sama funkcja z pewnymi modyfikacjami czyniącymi ją uniwersalną (poprzednia dotyczyła dni wolnych wg. NBP)
Co potrafi funkcja:- wylicza dzień pracujący w roku
- bierze pod uwagę dni ustawowo wolne od pracy
- bierze pod uwagę wolne dni weekendowe
- może uznawać soboty za dni pracujące
- może uznać podane dni za dodatkowe dni wolne
- może uznać podane dni za dodatkowe dni pracujące
- sprawdza czy dany dzień wolny (dodany lub ustawowy) nie pokrywa się z innym dniem wolnym od pracy (np. nie wypada w niedzielę) i bierze to pod uwagę
workingDayOfYear()<?php
function workingDayOfYear
($timeStamp = null, $freeSaturdays = true, $extraFreeDays = array(), $extraWorkingDays = array()) {
$freeHolidayDays = 0;
$addWorkingDays = 0;
$timeStamp = is_null($timeStamp) ?
time() : $timeStamp; $dayOfYear = date('z', $timeStamp)+1;
$year = date('Y', $timeStamp); $easterDay = easter_date($year);
$extraWorkingDays = (array)$extraWorkingDays; $extraFreeDays = (array)$extraFreeDays;
/*
od aktualnego tygonia roku odejmujemy 1
bo aktualny tydzien nie jest jeszcze zakonczony
*/
$passedWeekends = (int
)date('W', $timeStamp)-1; $freeWeekendDays= $passedWeekends;
/*
funkcja date('W') liczy tygonie w roku rozpoczynajac od poniedzialku
stad, jezeli 1 stycznia wypada w niedziele odejmujemy jeden tydzien
jezeli wypada pozniej niz w poniedzialek, dodajemy jeden tydzien
*/
if($firstDayOfYear == 0)
{ $passedWeekends--;
}
else if ($firstDayOfYear > 1)
{ $passedWeekends++;
}
/*
lista dni ustawowo wolnych od pracy wg.
Ustawa z dnia 18 stycznia 1951 r. o dniach wolnych od pracy.
(Dz.U. 1951 nr 4 poz. 28) z pozniejszymi zmianami
isip.sejm.gov.pl/servlet/Search?todo=file&id=WDU19510040028&type=3&name=D9510028.pdf
*/
mktime(0
,0
,0
,1
,1
,$year), // nowy rok $easterDay, // pierwszy dzien wielkiej nocy
$easterDay + 86400, // drugi dzien wielkiej nocy
mktime(0
,0
,0
,5
,1
,$year), // 1 maja mktime(0
,0
,0
,5
,3
,$year), // 3 maja $easterDay + (60*86400), // boze cialo
$easterDay + (49*86400), // zielone swiatki
mktime(0
,0
,0
,8
,15
,$year), // 15 sierpnia mktime(0
,0
,0
,11
,1
,$year), // 1 listopada mktime(0
,0
,0
,11
,11
,$year), // 11 listopada mktime(0
,0
,0
,12
,25
,$year), // 25 grudnia mktime(0
,0
,0
,12
,26
,$year) // 26 grudnia );
/*
jezeli sobota jest dniem wolnym liczbe wolnych dni weekendowych
mnozymy przez 2 (wczesniej ujete tylko wolne niedziele)
*/
if ($freeSaturdays)
{ $freeWeekendDays *= 2;
}
/*
zsumowanie dodatkowych wolnych dni
- przed data do ktorej liczymy
- z pominieciem dni, ktore wypadly w weekend, wiec i tak sa wolne
*/
foreach ($freeDaysArray as $holidayTimeStamp)
{
/*
pomijamy jezeli dzien swiateczny jest
pozniej niz badana data
*/
if ($holidayTimeStamp > $timeStamp)
{ continue;
}
/*
jezeli swieto nie wypada w dzien wolny od pracy
jako dzien weekendowy dodajemy je do wolnych dni swiatecznych
*/
$holidayDayOfWeek = (int
)date('w', $holidayTimeStamp);
if ($holidayDayOfWeek == 0 || ($holidayDayOfWeek == 6 && $freeSaturdays))
{ continue;
}
$freeHolidayDays++;
}
foreach($extraWorkingDays as $workingDayTimeStamp)
{
if ($workingDayTimeStamp > $timeStamp)
{ continue;
}
$workingDayOfWeek = (int
)date('w', $workingDayTimeStamp);
if ($workingDayOfWeek != 0 || ($workingDayOfWeek == 6 && !$freeSaturdays))
{ continue;
}
$addWorkingDays++;
}
/*
liczymy ktoru to dzien pracujacy w roku
wolne dni weekendy - wolne dni swiateczne (-dodatkowe dni wolne) (+dodatkowe dni pracujace)
*/
$workingDay = $dayOfYear - $freeWeekendDays - $freeHolidayDays + $addWorkingDays;
return $workingDay;
}
?>
Przykłady<?php
// dzisiejsza data: 2007-01-31
$WorkingDayOfYear = WorkingDayOfYear();
/*
dla dzisiejszej daty
soboty wolne
--> 22 dzien pracujacy
*/
$WorkingDayOfYear = WorkingDayOfYear
(time(), true, mktime(0
,0
,0
,1
,8
,2007
)); /*
dla dzisiejszej daty,
soboty wolne,
dodatkowy dzien wolny (2007-01-08)
--> 21 dzien pracujacy
*/
$WorkingDayOfYear = WorkingDayOfYear
(time(), false, mktime(0
,0
,0
,1
,8
,2007
), array(mktime(0
,0
,0
,1
,1
,2007
),mktime(0
,0
,0
,1
,7
,2007
))); /*
dla dzisiejszej daty,
soboty pracujace,
dodatkowy dzien wolny(2007-01-08),
dwa dodatkowe dni pracujace (2007-01-01, 2007-01-07)
--> 26 dzien pracujacy
*/
?>
Prawdopodobnie nikomu do niczego nie będzie to potrzebne, ale jeżeli okaże się inaczej - można używać do woli.
pozdr.