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==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:
1
2
3
4
<?php
echo workDaysNextDate('2010-09-04',8); echo workDaysNextDate('2010-10-01',2); ?>
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==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