Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Który dzień pracujący w roku
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
siemakuba
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()
  1. <?php
  2. function workingDayOfYear($timeStamp = null, $freeSaturdays = true, $extraFreeDays = array(), $extraWorkingDays = array())
  3. {
  4. $freeHolidayDays = 0;
  5. $addWorkingDays  = 0;
  6. $timeStamp = is_null($timeStamp) ? time() : $timeStamp;
  7. $firstDayOfYear  = date('w', mktime(0,0,0,1,1,date('Y', $timeStamp)));
  8. $dayOfYear = date('z', $timeStamp)+1;
  9.  
  10. $year  = date('Y', $timeStamp);
  11. $easterDay = easter_date($year);
  12. $extraWorkingDays  = (array)$extraWorkingDays;
  13. $extraFreeDays = (array)$extraFreeDays;
  14.  
  15. /*
  16. od aktualnego tygonia roku odejmujemy 1
  17. bo aktualny tydzien nie jest jeszcze zakonczony
  18. */
  19.  
  20. $passedWeekends = (int)date('W', $timeStamp)-1;
  21. $freeWeekendDays= $passedWeekends;
  22.  
  23. /*
  24. funkcja date('W') liczy tygonie w roku rozpoczynajac od poniedzialku
  25. stad, jezeli 1 stycznia wypada w niedziele odejmujemy jeden tydzien
  26. jezeli wypada pozniej niz w poniedzialek, dodajemy jeden tydzien 
  27.  */
  28.  
  29. if($firstDayOfYear == 0)
  30. {  $passedWeekends--;
  31. }
  32. else if ($firstDayOfYear > 1)
  33. {  $passedWeekends++;
  34. }
  35.  
  36. /*
  37. lista dni ustawowo wolnych od pracy wg.
  38. Ustawa z dnia 18 stycznia 1951 r. o dniach wolnych od pracy. 
  39. (Dz.U. 1951 nr 4 poz. 28) z pozniejszymi zmianami
  40. isip.sejm.gov.pl/servlet/Search?todo=file&id=WDU19510040028&type=3&name=D9510028.pdf
  41. */
  42.  
  43. $freeDaysArray = array(
  44. mktime(0,0,0,1,1,$year), // nowy rok
  45. $easterDay,  // pierwszy dzien wielkiej nocy
  46. $easterDay + 86400,  // drugi dzien wielkiej nocy
  47. mktime(0,0,0,5,1,$year), // 1 maja
  48. mktime(0,0,0,5,3,$year), // 3 maja
  49. $easterDay + (60*86400), // boze cialo
  50. $easterDay + (49*86400), // zielone swiatki
  51. mktime(0,0,0,8,15,$year),  // 15 sierpnia
  52. mktime(0,0,0,11,1,$year),  // 1 listopada
  53. mktime(0,0,0,11,11,$year), // 11 listopada
  54. mktime(0,0,0,12,25,$year), // 25 grudnia
  55. mktime(0,0,0,12,26,$year)  // 26 grudnia
  56. );
  57.  
  58. /*
  59. jezeli sobota jest dniem wolnym liczbe wolnych dni weekendowych
  60. mnozymy przez 2 (wczesniej ujete tylko wolne niedziele)
  61. */
  62.  
  63. if ($freeSaturdays)
  64. {  $freeWeekendDays *= 2;
  65. }
  66.  
  67. /*
  68. zsumowanie dodatkowych wolnych dni
  69. - przed data do ktorej liczymy
  70. - z pominieciem dni, ktore wypadly w weekend, wiec i tak sa wolne
  71. */
  72.  
  73. $freeDaysArray = array_unique(array_merge($freeDaysArray, $extraFreeDays));
  74.  
  75. foreach ($freeDaysArray as $holidayTimeStamp)
  76. {  
  77. /*
  78. pomijamy jezeli dzien swiateczny jest 
  79. pozniej niz badana data
  80. */
  81. if ($holidayTimeStamp > $timeStamp)
  82. {  continue;
  83. }
  84.  
  85. /*
  86. jezeli swieto nie wypada w dzien wolny od pracy
  87. jako dzien weekendowy dodajemy je do wolnych dni swiatecznych
  88. */
  89.  
  90. $holidayDayOfWeek = (int)date('w', $holidayTimeStamp);
  91.  
  92. if ($holidayDayOfWeek == 0 || ($holidayDayOfWeek == 6 && $freeSaturdays))
  93. {  continue;
  94. }
  95.  
  96. $freeHolidayDays++;
  97. }
  98.  
  99. foreach($extraWorkingDays as $workingDayTimeStamp)
  100. {
  101. if ($workingDayTimeStamp > $timeStamp)
  102. {  continue;
  103. }
  104.  
  105. $workingDayOfWeek = (int)date('w', $workingDayTimeStamp);
  106.  
  107. if ($workingDayOfWeek != 0 || ($workingDayOfWeek == 6 && !$freeSaturdays))
  108. {  continue;
  109. }
  110.  
  111. $addWorkingDays++;
  112. }
  113.  
  114. /*
  115. liczymy ktoru to dzien pracujacy w roku
  116. wolne dni weekendy - wolne dni swiateczne (-dodatkowe dni wolne) (+dodatkowe dni pracujace)
  117. */
  118.  
  119. $workingDay = $dayOfYear - $freeWeekendDays - $freeHolidayDays + $addWorkingDays; 
  120. return $workingDay;
  121. }
  122. ?>


Przykłady

  1. <?php
  2. // dzisiejsza data: 2007-01-31
  3.  
  4. $WorkingDayOfYear = WorkingDayOfYear();
  5. /*
  6. dla dzisiejszej daty
  7. soboty wolne
  8.  
  9. --> 22 dzien pracujacy
  10. */
  11.  
  12. $WorkingDayOfYear = WorkingDayOfYear(time(), true, mktime(0,0,0,1,8,2007));
  13. /*
  14. dla dzisiejszej daty, 
  15. soboty wolne, 
  16. dodatkowy dzien wolny (2007-01-08)
  17.  
  18. --> 21 dzien pracujacy
  19. */
  20.  
  21. $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)));
  22. /*
  23. dla dzisiejszej daty, 
  24. soboty pracujace, 
  25. dodatkowy dzien wolny(2007-01-08), 
  26. dwa dodatkowe dni pracujace (2007-01-01, 2007-01-07)
  27.  
  28. --> 26 dzien pracujacy
  29. */
  30. ?>



Prawdopodobnie nikomu do niczego nie będzie to potrzebne, ale jeżeli okaże się inaczej - można używać do woli.

pozdr.
linuxoida
Oczywiście, że się przydało
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.