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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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==|| $weekDay==|| 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:
1
2
3
4
<?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ć.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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==|| $weekDay==|| 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