Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Liczba dni roboczych, Funkcja, PHP 4 i 5
nospor
post 18.04.2005, 08:07:01
Post #1





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Napisałem funkcję do wyliczania liczby dni roboczych (bez sobót, niedziel oraz świąt) między dwoma datami:
  1. <?php
  2. function _workDays($date1, $date2)
  3. {
  4.     //święta w postaci mm-dd, pominąłem Wielkanoc i Boże Ciało, gdyż są to święta ruchome
  5.     $hol=array('01-01','05-01','05-03','08-15','11-11','12-25','12-26');
  6.  
  7.     $date1=strtotime($date1);$date2=strtotime($date2);
  8.     if ($date2===$date1) return 0;
  9.     $znak=1;//określa czy to będzie minus (gdy date1>date2) czy plus 
  10.     if ($date1>$date2)// minusy
  11.         {$datePom=$date1;$date1=$date2;$date2=$datePom;$znak=-1;}
  12.     $ilosc=0;
  13.     $date1=strtotime('+1 day',$date1);
  14.     $date2=strtotime('+1 day',$date2);
  15.     while ($date1<$date2)
  16.     {
  17.         $weekDay=date('w',$date1);
  18.         if (!($weekDay==|| $weekDay==|| in_array(date('m-d',$date1),$hol)))
  19.             $ilosc++;
  20.         $date1=strtotime('+1 day',$date1);
  21.     }
  22.     $ilosc*=$znak;
  23.     return $ilosc;
  24. }
  25.  
  26. ?>

wywołanie: echo _workDays('2005-04-11','2005-04-20');
Z założenia pierwsza data ma być miejsza od drugiej, w innym przypadku wynik będzie ujemny (mi to rozwiązanie było potrzebne, więc tak jest. Jak ktoś chce zawsze wynik dodatni, to usunąć linijkę $ilość*=$znak i wcześniej wszystko co dotyczyło zmiennej $znak).
Do liczby dni początkowa data nie jest liczona, czyli
echo _workDays('2005-04-18','2005-04-19');
zwróci 1.

Mam nadzieję że komuś się przyda smile.gif

edit:
Pełna funkcja z uwzględniem świąt ruchomych znajduje się tu:
http://nospor.pl/liczba-dni-roboczych-n23.html

Ten post edytował nospor 10.10.2007, 15:10:56


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kajko84
post 12.01.2007, 11:21:41
Post #2





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 24.11.2006

Ostrzeżenie: (0%)
-----


Witam

Jakis czas temu potrzebowalem do jednego z projektow funkcji wyliczajacej dni robocze w danym okresie. Trafilem tutaj smile.gif 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:

  1. <?php
  2. function workDays($date1, $date2)
  3. {
  4. $date1=strtotime($date1);
  5. $date2=strtotime($date2);
  6.  
  7. if ($date2===$date1) return 0;
  8. $znak=1; // określa czy to będzie minus (gdy date1>date2) czy plus 
  9. if ($date1>$date2) // minusy
  10. {$datePom=$date1;$date1=$date2;$date2=$datePom;$znak=-1;}
  11. $ilosc=0;
  12. $date1=strtotime('+1 day',$date1);
  13. $date2=strtotime('+1 day',$date2);
  14.  
  15. while ($date1<$date2)
  16. {
  17. $rok = date('Y', strtotime('',$date1));
  18. $wielkanoc = date('m-d', easter_date($rok)); // data wielkanocy w postaci mm-dd
  19. $data = $rok . '-' . $wielkanoc;
  20. $data = strtotime($data);
  21. $drugi = date('m-d', strtotime('+1 day', $data)); // poniedzialek po wielkanocy
  22. $b_cialo = date('m-d', strtotime('+60 days', $data)); // boze cialo
  23.  
  24. // święta w postaci mm-dd
  25. $hol=array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26',$wielkanoc,$drugi,$b_cialo);
  26.  
  27. $weekDay=date('w',$date1);
  28. if (!($weekDay==|| $weekDay==|| in_array(date('m-d',$date1),$hol)))
  29. $ilosc++;
  30. $date1=strtotime('+1 day',$date1);
  31. }
  32. $ilosc*=$znak;
  33. return $ilosc;
  34. }
  35. ?>


pozdrawiam!
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 5.06.2024 - 06:42