Dni robocze

2010-09-22 23:16:20 Post #1 cichy

 
Witam
To mój pierwszy post na tym forum.
Widziałem tu (na stronce) mały skrypcik który liczy liczbę dni roboczych pomiędzy dwoma datami ... a czy wymaga "dużo zachodu" skrypt w którym policzył by mi dla moich potrzeb coś takiego:
Przyjmuję zlecenie np. dziś i wpisuję że potrzebuje na to 5 dni roboczych. Skrypt podał by mi datę kolejnego dnia roboczego (w tym przykładzie 6-tego) od daty zadanej.
Z góry dziękuję
Pozdr.
Cichy

2010-09-23 07:09:43 Post #2 nospor

 
No hej,
"Troszkę" przeróbek by było. W wolnej chwili (dziś lub jutro) postaram się coś skrobnąć.

Podam jeszcze linka dla niewtajemniczonych do głównego skryptu, który był wspominany.
liczba dni roboczych

2010-09-23 19:28:13 Post #3 nospor

 
Ok, spłodziłem taki kodzik
<?php
function workDaysNextDate($date1,$workDays) { 
    $workDays = (int)$workDays;
	if ($workDays <= 0)
		return null;
	$date1=strtotime('-1 day',strtotime($date1));
	$lastYear = null;
    $hol=array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26'); 
    $i = 0;
	while ($i<=$workDays) { 
        $date1=strtotime('+1 day',$date1);
		$year = date('Y', $date1); 
        if ($year !== $lastYear){ 
            $lastYear = $year; 
            $easter = date('m-d', easter_date($year)); 
            $date = strtotime($year . '-' . $easter); 
            $easterSec = date('m-d', strtotime('+1 day', $date)); 
            $cc = date('m-d', strtotime('+60 days', $date)); 
            $hol[8] = $easter; 
            $hol[9] = $easterSec; 
            $hol[10] = $cc; 
        } 
        $weekDay=date('w',$date1); 
        if (!($weekDay==0 || $weekDay==6 || in_array(date('m-d',$date1),$hol))) 
            $i++; 
        
    } 
    return date('Y-m-d',$date1); 
}
?>

Za bardzo nie testowane. Potestuj sam i daj znać.

Przykłady użycia:
<?php
echo workDaysNextDate('2010-09-04',8); //wyświetli 2010-09-16
echo workDaysNextDate('2010-10-01',2); //wyświetli 2010-10-05
?>

2010-09-23 23:23:13 Post #4 cichy

 
Wielkie dzięki
działa super, z 20 próbnych dat wprowadziłem i różnych ilości dni .. i wszystko wydaję się być ok
Jeszcze raz dzięki.

2010-09-30 00:49:02 Post #5 gość_behemot

 
dobry pomysł, ale można prościej - modyfikacja Twojej funkcji:

function date_after_workday($fdate, $days){
$free = array('01-01','01-06','05-01','05-03','08-15','11-01','11-11','12-25','12-26');
$i = 1;
while($i <= $days) {
$fdate = date('Y-m-d', strtotime('+1 day', strtotime($fdate)));
$weekday = date('w', strtotime($fdate));
$year = substr($fdate, 0, 4);
$rest = substr($fdate, 5);
if($weekday == 6 or $weekday == 0 or $rest == easter($year) or in_array($rest, $free))
continue;
$i++;
}
return $fdate;
}

2010-09-30 07:17:17 Post #6 nospor

 
@behemot Twoja krótsza wersja nie działa
1) Nie uwzględnia bożego ciała
2) Nie uwzględnia drugiego dnia świąt wielkanocy
3) Używasz funkcji easter(), która nie istnieje

2012-03-06 09:59:31 Post #7 gość_scet

 
Wszystko jest ok. Funkcja działa rewelacyjnie jeśli chcemy dodać dni robocze. A czy da się ją zmodyfikować tak aby można było odejmować np. 5 dni roboczych??

2012-03-06 10:07:20 Post #8 nospor

 
Analogicznie.... wystarczy odejmować.
<?php
function workDaysPrevDate($date1,$workDays) {  
    $workDays = (int)$workDays; 
    if ($workDays <= 0) 
        return null; 
    $date1=strtotime('+1 day',strtotime($date1)); 
    $lastYear = null; 
    $hol=array('01-01','05-01','05-03','08-15','11-01','11-11','12-25','12-26');  
    $i = 0; 
    while ($i<=$workDays) {  
        $date1=strtotime('-1 day',$date1); 
        $year = date('Y', $date1);  
        if ($year !== $lastYear){  
            $lastYear = $year;  
            $easter = date('m-d', easter_date($year));  
            $date = strtotime($year . '-' . $easter);  
            $easterSec = date('m-d', strtotime('+1 day', $date));  
            $cc = date('m-d', strtotime('+60 days', $date));  
            $hol[8] = $easter;  
            $hol[9] = $easterSec;  
            $hol[10] = $cc;  
        }  
        $weekDay=date('w',$date1);  
        if (!($weekDay==0 || $weekDay==6 || in_array(date('m-d',$date1),$hol)))  
            $i++;  
         
    }  
    return date('Y-m-d',$date1);  
}

echo workDaysPrevDate('2012-03-06',4);

?>

2012-03-06 11:31:49 Post #9 gość_scet

 
Dzięki za błyskawiczną odpowiedź. Działa rewelacyjnie

Odpowiedz

Ostatnio komentowane

  1. ShoutBox Podświadomość
  2. ShoutBox Trilux
  3. ShoutBox morelowy-dolomit
  4. ShoutBox Lucidoremi
  5. ShoutBox Goran Lezczek
  6. ShoutBox Ktos
  7. Opcje dwuwartościowe... gosc

Ostatnio na forum

  1. Zbiorniki stalowe Zbiorniki stalowe
  2. Wirtualne biuro Gdań... Wirtualne biuro Gdańsk
  3. Podział majątku Bydg... Podział majątku Bydgoszcz
  4. twojedobrenarzedzia.... twojedobrenarzedzia.pl
  5. Drabina rozsuwana Drabina rozsuwana
  6. Rusztowanie aluminio... Rusztowanie aluminiowe jezdne
  7. Serwis wózków widłow... Serwis wózków widłowych Bydgoszcz

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer