Napisałem funkcję do wyliczania liczby dni roboczych (bez sobót, niedziel oraz świąt) między dwoma datami:
<?php function _workDays($date1, $date2) { //święta w postaci mm-dd, pominąłem Wielkanoc i Boże Ciało, gdyż są to święta ruchome $hol=http://www.php.net/array('01-01','05-01','05-03','08-15','11-11','12-25','12-26'); $date1=http://www.php.net/strtotime($date1);$date2=http://www.php.net/strtotime($date2); if ($date2===$date1) return 0; $znak=1;//określa czy to będzie minus (gdy date1>date2) czy plus if ($date1>$date2)// minusy {$datePom=$date1;$date1=$date2;$date2=$datePom;$znak=-1;} $ilosc=0; $date1=http://www.php.net/strtotime('+1 day',$date1); $date2=http://www.php.net/strtotime('+1 day',$date2); while ($date1<$date2) { $weekDay=http://www.php.net/date('w',$date1); if (!($weekDay==0 || $weekDay==6 || http://www.php.net/in_array(http://www.php.net/date('m-d',$date1),$hol))) $ilosc++; $date1=http://www.php.net/strtotime('+1 day',$date1); } $ilosc*=$znak; return $ilosc; } ?>
Przydało się (do statystyk) Działa.
Bardzo się przydało... w sprawdzaniu terminowości zleceń serwisowych...
Duże thx i pozdro
musialo ci sie nudzic, takie sobie, nic specjalnego. Ale jak by liczyl wszystkie dni i swieta "ruchome" to by było cos
Hm, a skąd wiadomo kiedy wypadnie ruchome święto w danym roku?
trochę samodzielności: http://pl.wikipedia.org/wiki/%C5%9Awi%C4%99ta_ruchome
Czyli wyglądana to, że większość świąt zależy od Wielkanocy, a wielkanoc
Witam
Jakis czas temu potrzebowalem do jednego z projektow funkcji wyliczajacej dni robocze w danym okresie. Trafilem tutaj i wykorzystalem fukcje napisana przez nospora, z tym ze potrzebowalem rowniez "swiat ruchomych" wiec na miare moich mozliwosci rozwinalem troszke ta bardzo fajna funkcje (za ktora serdecznie dziekuje nospor i mam nadzieje ze nie masz nic przeciwko temu za ja troche zmodyfikowalem i zamiescilem)...
A oto kod:
<?php function workDays($date1, $date2) { $date1=http://www.php.net/strtotime($date1); $date2=http://www.php.net/strtotime($date2); if ($date2===$date1) return 0; $znak=1; // określa czy to będzie minus (gdy date1>date2) czy plus if ($date1>$date2) // minusy {$datePom=$date1;$date1=$date2;$date2=$datePom;$znak=-1;} $ilosc=0; $date1=http://www.php.net/strtotime('+1 day',$date1); $date2=http://www.php.net/strtotime('+1 day',$date2); while ($date1<$date2) { $rok = http://www.php.net/date('Y', http://www.php.net/strtotime('',$date1)); $wielkanoc = http://www.php.net/date('m-d', easter_date($rok)); // data wielkanocy w postaci mm-dd $data = $rok . '-' . $wielkanoc; $data = http://www.php.net/strtotime($data); $drugi = http://www.php.net/date('m-d', http://www.php.net/strtotime('+1 day', $data)); // poniedzialek po wielkanocy $b_cialo = http://www.php.net/date('m-d', http://www.php.net/strtotime('+60 days', $data)); // boze cialo // święta w postaci mm-dd $hol=http://www.php.net/array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26',$wielkanoc,$drugi,$b_cialo); $weekDay=http://www.php.net/date('w',$date1); if (!($weekDay==0 || $weekDay==6 || http://www.php.net/in_array(http://www.php.net/date('m-d',$date1),$hol))) $ilosc++; $date1=http://www.php.net/strtotime('+1 day',$date1); } $ilosc*=$znak; return $ilosc; } ?>
Właśnie próbowałem użyć funkcji i niestety ma ona "błęda":
<?php $rok = http://www.php.net/date('Y', http://www.php.net/strtotime('',$date1)); ?>
<?php $rok = http://www.php.net/date('Y', http://www.php.net/strtotime('now',$date1)); ?>
Trochę czuję się jak archeolog odkopując stary temat, ale szukałem (pewnie słabo) rozwiązania i nie znalazłem a może takowe istnieje, jest proste i nie będę musiał wyważać otwartych drzwi.
Chodzi o stworzenie daty z posiadanego dnia roboczego (w formacie 3 znakowym), ewentualnie zamianie dnia roboczego na kolejny dzień roku.
O to ci chodzi:
http://forum.nospor.pl/programowanie/php/dni-robocze-ft30.html
?
Patrzyłem na to i byłem przekonany, że to kolejna funkcja do obliczania ilości dni pomiędzy datami a tu...
Dziękuję bardzo - przyda się.
A jednak za szybko się ucieszyłem. Ale spróbuję na bazie tego zrobić co mi potrzeba.
Dla mnie wprowadzony musi być 1 argument - dzień roboczy w formie 3 znakowej (ew. drugi - rok) i wynikiem powinna być data, którą dany dzień w danym roku reprezentuje.
Stworzyłem coś takiego na bazie tego co podawałeś:
function data_z_dnia_roboczego($d, $y=""){ //rok $y = (!http://www.php.net/empty($y)) ? $y : http://www.php.net/date("Y"); //święta $hol=http://www.php.net/array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26'); //święta ruchome $easter = http://www.php.net/date('m-d', easter_date($y)); $date = http://www.php.net/strtotime($y . '-' . $easter); $easterSec = http://www.php.net/date('m-d', http://www.php.net/strtotime('+1 day', $date)); $cc = http://www.php.net/date('m-d', http://www.php.net/strtotime('+60 days', $date)); //Boże ciało $zs = http://www.php.net/date('m-d', http://www.php.net/strtotime('+50 days', $date)); //Zielone świątki $hol[8] = $easter; $hol[9] = $easterSec; $hol[10] = $cc; $hol[11] = $zs; $robocze = http://www.php.net/array(); $dzienR = 1; for ($i=0; $i<=356; $i++){ //to może wyglądać lepiej $dz = ($i<=9) ? "00".$i : $dz; $dz = ($i<=99 && $i>=10) ? "0".$i : $dz; $dz = ($i>=100) ? $i : $dz; $data = DateTime::createFromFormat('z Y', http://www.php.net/strval($dz) . ' ' . http://www.php.net/strval($y)); $weekDay = $data->format('w'); $md = $data->format('m-d'); if (!($weekDay==0 || $weekDay==6 || http://www.php.net/in_array($md,$hol) || $y>2010 && $md=='01-06')) { $robocze[$dzienR] = $data->format('Y-m-d'); $dzienR++; } } return $robocze[http://www.php.net/intval($d)]; }
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)