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. Pager 2.5.1 oraz EPa... Na szybko2
  2. Pager 2.5.1 oraz EPa... Sławek
  3. Mysql - FAQ Piotr
  4. Liczba dni roboczych Na szybko2
  5. Liczba dni roboczych Naszybko
  6. Klasa widoku nospor
  7. Klasa widoku freebox

Ostatnio na forum

  1. PHP Developer / Prog... MaxieHill
  2. programista php-webm... pracamatysart
  3. Programista PHP/ Mag... Create Magento 2 Marketplace
  4. Baza Danych gosc
  5. Baza Danych YankeS
  6. Baza Danych gosc
  7. Baza Danych YankeS

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