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 457
Pomógł: 6297
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
buul
post 8.01.2014, 12:39:16
Post #2





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 7.09.2007
Skąd: z zadupia

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


Patrzyłem na to i byłem przekonany, że to kolejna funkcja do obliczania ilości dni pomiędzy datami a tu... smile.gif

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ś:

  1. function data_z_dnia_roboczego($d, $y=""){
  2.  
  3. //rok
  4. $y = (!empty($y)) ? $y : date("Y");
  5.  
  6. //święta
  7. $hol=array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26');
  8.  
  9. //święta ruchome
  10. $easter = date('m-d', easter_date($y));
  11. $date = strtotime($y . '-' . $easter);
  12. $easterSec = date('m-d', strtotime('+1 day', $date));
  13. $cc = date('m-d', strtotime('+60 days', $date)); //Boże ciało
  14. $zs = date('m-d', strtotime('+50 days', $date)); //Zielone świątki
  15. $hol[8] = $easter;
  16. $hol[9] = $easterSec;
  17. $hol[10] = $cc;
  18. $hol[11] = $zs;
  19.  
  20. $robocze = array();
  21. $dzienR = 1;
  22.  
  23. for ($i=0; $i<=356; $i++){
  24.  
  25. //to może wyglądać lepiej
  26. $dz = ($i<=9) ? "00".$i : $dz;
  27. $dz = ($i<=99 && $i>=10) ? "0".$i : $dz;
  28. $dz = ($i>=100) ? $i : $dz;
  29.  
  30. $data = DateTime::createFromFormat('z Y', strval($dz) . ' ' . strval($y));
  31.  
  32. $weekDay = $data->format('w');
  33. $md = $data->format('m-d');
  34.  
  35. if (!($weekDay==0 || $weekDay==6 || in_array($md,$hol) || $y>2010 && $md=='01-06')) {
  36. $robocze[$dzienR] = $data->format('Y-m-d');
  37. $dzienR++;
  38. }
  39.  
  40. }
  41.  
  42. return $robocze[intval($d)];
  43. }


Dodałem Zielone Świątki do dni wolnych. Nie jestem jeszcze pewien tego, czy zwracany index nie powinien być o 1 większy (bo liczba dni w roku z "z" zaczyna się od 000), ale dla mojego zastosowania jest ok. Jeszcze jak usunie się "$weekDay==6" to soboty stają się również dniami roboczymi.

Ten post edytował buul 8.01.2014, 07:56:06
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 14:56