php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.10.2007, 19:27  
bp158
Gast
 
Beiträge: n/a
Standard Arbeitstage berechnen (Mo-Fr)

Hi,

wie kann ich einfach und schnell berechnen, welcher Tag von heute an in zB. 10 Tage ist (nur Arbeitstage also Mo-Fr, keine Bundesfeiertage (können aus mysql-db kommen)) ??

Meine momentane 'Funktion' sieht so aus:

PHP-Code:

function check_feiertag($datum)
   {
   
$datum date("Y-m-d",$datum);
   
$abfrage "SELECT id,datum FROM feiertage WHERE (datum = '$datum' AND abgelaufen='0') LIMIT 1";
   
$ergebnis mysql_query($abfrage) or die("Fehler beim lesen aus der Datenbank aufgetreten (Feiertage).
ErrNo: "
.mysql_errno()." Error: ".mysql_error()."
"
);
  
   if (
mysql_num_rows($ergebnis) == 1)
     {
     return 
true;
     }  
    else
     {
     return 
false;    
     }
   
   
mysql_free_result($ergebnis);    
   }

function 
get_fertigstellung($ftgz_zeit)
   {
   
$fertigungszeit $ftgz_zeit;

   
$fertigungstage = array();
   
   
$ftgt0 time();

   if (
date("w",$ftgt0) == "0" OR date("w",$ftgt0) == "6" OR check_feiertag($ftgt0)=="ja")
     {
     if (
check_feiertag($ftgt0)=="ja")
       {
       
$ftgt0 $ftgt0 86400;    
       }

     if (
date("w",$ftgt0) == "0")
       {
       
$ftgt0 $ftgt0 86400;
       }

     if (
date("w",$ftgt0) == "6")
       {
       
$ftgt0 $ftgt0 172800;    
       }

     if (
check_feiertag($ftgt0)=="ja")
       {
       
$ftgt0 $ftgt0 86400;    
       }

     if (
date("w",$ftgt0) == "0")
       {
       
$ftgt0 $ftgt0 86400;
       }

     if (
date("w",$ftgt0) == "6")
       {
       
$ftgt0 $ftgt0 172800;    
       }
     }

   if (
date("H",$ftgt0) < 14)
     {
     
$fertigungszeit $fertigungszeit 1;
     }

   
$ftgt01 $ftgt0 86400;

   
   if (
date("w",$ftgt01) == "0" OR date("w",$ftgt01) == "6" OR check_feiertag($ftgt01)=="ja")
     {
     if (
check_feiertag($ftgt01)=="ja")
       {
       
$ftgt01 $ftgt01 86400;    
       }

     if (
date("w",$ftgt01) == "0")
       {
       
$ftgt01 $ftgt01 86400;
       }

     if (
date("w",$ftgt01) == "6")
       {
       
$ftgt01 $ftgt01 172800;    
       }

     if (
check_feiertag($ftgt01)=="ja")
       {
       
$ftgt01 $ftgt01 86400;    
       }

     if (
date("w",$ftgt01) == "0")
       {
       
$ftgt01 $ftgt01 86400;
       }

     if (
date("w",$ftgt01) == "6")
       {
       
$ftgt01 $ftgt01 172800;    
       }

     
array_push($fertigungstage$ftgt01);
     }
    else
     {
     
array_push($fertigungstage$ftgt01);
     }

   
$ftgt02 $ftgt01 86400;

   
   if (
date("w",$ftgt02) == "0" OR date("w",$ftgt02) == "6" OR check_feiertag($ftgt02)=="ja")
     {
     if (
check_feiertag($ftgt02)=="ja")
       {
       
$ftgt02 $ftgt02 86400;    
       }

     if (
date("w",$ftgt02) == "0")
       {
       
$ftgt02 $ftgt02 86400;
       }

     if (
date("w",$ftgt02) == "6")
       {
       
$ftgt02 $ftgt02 172800;    
       }

     if (
check_feiertag($ftgt02)=="ja")
       {
       
$ftgt02 $ftgt02 86400;    
       }

     if (
date("w",$ftgt02) == "0")
       {
       
$ftgt02 $ftgt02 86400;
       }

     if (
date("w",$ftgt02) == "6")
       {
       
$ftgt02 $ftgt02 172800;    
       }

     
array_push($fertigungstage$ftgt02);
     }
    else
     {
     
array_push($fertigungstage$ftgt02);
     }

   
$ftgt03 $ftgt02 86400;

   
   if (
date("w",$ftgt03) == "0" OR date("w",$ftgt03) == "6" OR check_feiertag($ftgt03)=="ja")
     {
     if (
check_feiertag($ftgt03)=="ja")
       {
       
$ftgt03 $ftgt03 86400;    
       }

     if (
date("w",$ftgt03) == "0")
       {
       
$ftgt03 $ftgt03 86400;
       }

     if (
date("w",$ftgt03) == "6")
       {
       
$ftgt03 $ftgt03 172800;    
       }

     if (
check_feiertag($ftgt03)=="ja")
       {
       
$ftgt03 $ftgt03 86400;    
       }

     if (
date("w",$ftgt03) == "0")
       {
       
$ftgt03 $ftgt03 86400;
       }

     if (
date("w",$ftgt03) == "6")
       {
       
$ftgt03 $ftgt03 172800;    
       }

     
array_push($fertigungstage$ftgt03);
     }
    else
     {
     
array_push($fertigungstage$ftgt03);
     }


   
$ftgt04 $ftgt03 86400;
   
   if (
date("w",$ftgt04) == "0" OR date("w",$ftgt04) == "6" OR check_feiertag($ftgt04)=="ja")
     {
     if (
check_feiertag($ftgt04)=="ja")
       {
       
$ftgt04 $ftgt04 86400;    
       }

     if (
date("w",$ftgt04) == "0")
       {
       
$ftgt04 $ftgt04 86400;
       }

     if (
date("w",$ftgt04) == "6")
       {
       
$ftgt04 $ftgt04 172800;    
       }

     if (
check_feiertag($ftgt04)=="ja")
       {
       
$ftgt04 $ftgt04 86400;    
       }

     if (
date("w",$ftgt04) == "0")
       {
       
$ftgt04 $ftgt04 86400;
       }

     if (
date("w",$ftgt04) == "6")
       {
       
$ftgt04 $ftgt04 172800;    
       }

     
array_push($fertigungstage$ftgt04);
     }
    else
     {
     
array_push($fertigungstage$ftgt04);
     }


   
$ftgt05 $ftgt04 86400;
   
   if (
date("w",$ftgt05) == "0" OR date("w",$ftgt05) == "6" OR check_feiertag($ftgt05)=="ja")
     {
     if (
check_feiertag($ftgt05)=="ja")
       {
       
$ftgt05 $ftgt05 86400;    
       }

     if (
date("w",$ftgt05) == "0")
       {
       
$ftgt05 $ftgt05 86400;
       }

     if (
date("w",$ftgt05) == "6")
       {
       
$ftgt05 $ftgt05 172800;    
       }

     if (
check_feiertag($ftgt05)=="ja")
       {
       
$ftgt05 $ftgt05 86400;    
       }

     if (
date("w",$ftgt05) == "0")
       {
       
$ftgt05 $ftgt05 86400;
       }

     if (
date("w",$ftgt05) == "6")
       {
       
$ftgt05 $ftgt05 172800;    
       }

     
array_push($fertigungstage$ftgt05);
     }
    else
     {
     
array_push($fertigungstage$ftgt05);
     }


   
$ftgt06 $ftgt05 86400;
   
   if (
date("w",$ftgt06) == "0" OR date("w",$ftgt06) == "6" OR check_feiertag($ftgt06)=="ja")
     {
     if (
check_feiertag($ftgt06)=="ja")
       {
       
$ftgt06 $ftgt06 86400;    
       }

     if (
date("w",$ftgt06) == "0")
       {
       
$ftgt06 $ftgt06 86400;
       }

     if (
date("w",$ftgt06) == "6")
       {
       
$ftgt06 $ftgt06 172800;    
       }

     if (
check_feiertag($ftgt06)=="ja")
       {
       
$ftgt06 $ftgt06 86400;    
       }

     if (
date("w",$ftgt06) == "0")
       {
       
$ftgt06 $ftgt06 86400;
       }

     if (
date("w",$ftgt06) == "6")
       {
       
$ftgt06 $ftgt06 172800;    
       }

     
array_push($fertigungstage$ftgt06);
     }
    else
     {
     
array_push($fertigungstage$ftgt06);
     }


   
$ftgt07 $ftgt06 86400;
   
   if (
date("w",$ftgt07) == "0" OR date("w",$ftgt07) == "6" OR check_feiertag($ftgt07)=="ja")
     {
     if (
check_feiertag($ftgt07)=="ja")
       {
       
$ftgt07 $ftgt07 86400;    
       }

     if (
date("w",$ftgt07) == "0")
       {
       
$ftgt07 $ftgt07 86400;
       }

     if (
date("w",$ftgt07) == "6")
       {
       
$ftgt07 $ftgt07 172800;    
       }

     if (
check_feiertag($ftgt07)=="ja")
       {
       
$ftgt07 $ftgt07 86400;    
       }

     if (
date("w",$ftgt07) == "0")
       {
       
$ftgt07 $ftgt07 86400;
       }

     if (
date("w",$ftgt07) == "6")
       {
       
$ftgt07 $ftgt07 172800;    
       }

     
array_push($fertigungstage$ftgt07);
     }
    else
     {
     
array_push($fertigungstage$ftgt07);
     }


   
$ftgt08 $ftgt07 86400;
   
   if (
date("w",$ftgt08) == "0" OR date("w",$ftgt08) == "6" OR check_feiertag($ftgt08)=="ja")
     {
     if (
check_feiertag($ftgt08)=="ja")
       {
       
$ftgt08 $ftgt08 86400;    
       }

     if (
date("w",$ftgt08) == "0")
       {
       
$ftgt08 $ftgt08 86400;
       }

     if (
date("w",$ftgt08) == "6")
       {
       
$ftgt08 $ftgt08 172800;    
       }

     if (
check_feiertag($ftgt08)=="ja")
       {
       
$ftgt08 $ftgt08 86400;    
       }

     if (
date("w",$ftgt08) == "0")
       {
       
$ftgt08 $ftgt08 86400;
       }

     if (
date("w",$ftgt08) == "6")
       {
       
$ftgt08 $ftgt08 172800;    
       }

     
array_push($fertigungstage$ftgt08);
     }
    else
     {
     
array_push($fertigungstage$ftgt08);
     }


   
$ftgt09 $ftgt08 86400;
   
   if (
date("w",$ftgt09) == "0" OR date("w",$ftgt09) == "6" OR check_feiertag($ftgt09)=="ja")
     {
     if (
check_feiertag($ftgt09)=="ja")
       {
       
$ftgt09 $ftgt09 86400;    
       }

     if (
date("w",$ftgt09) == "0")
       {
       
$ftgt09 $ftgt09 86400;
       }

     if (
date("w",$ftgt09) == "6")
       {
       
$ftgt09 $ftgt09 172800;    
       }

     if (
check_feiertag($ftgt09)=="ja")
       {
       
$ftgt09 $ftgt09 86400;    
       }

     if (
date("w",$ftgt09) == "0")
       {
       
$ftgt09 $ftgt09 86400;
       }

     if (
date("w",$ftgt09) == "6")
       {
       
$ftgt09 $ftgt09 172800;    
       }

     
array_push($fertigungstage$ftgt09);
     }
    else
     {
     
array_push($fertigungstage$ftgt09);
     }


   
$ftgt10 $ftgt09 86400;
   
   if (
date("w",$ftgt10) == "0" OR date("w",$ftgt10) == "6" OR check_feiertag($ftgt10)=="ja")
     {
     if (
check_feiertag($ftgt10)=="ja")
       {
       
$ftgt10 $ftgt10 86400;    
       }

     if (
date("w",$ftgt10) == "0")
       {
       
$ftgt10 $ftgt10 86400;
       }

     if (
date("w",$ftgt10) == "6")
       {
       
$ftgt10 $ftgt10 172800;    
       }

     if (
check_feiertag($ftgt10)=="ja")
       {
       
$ftgt10 $ftgt10 86400;    
       }

     if (
date("w",$ftgt10) == "0")
       {
       
$ftgt10 $ftgt10 86400;
       }

     if (
date("w",$ftgt10) == "6")
       {
       
$ftgt10 $ftgt10 172800;    
       }

     
array_push($fertigungstage$ftgt10);
     }
    else
     {
     
array_push($fertigungstage$ftgt10);
     }


   
$ftgt11 $ftgt10 86400;
   
   if (
date("w",$ftgt11) == "0" OR date("w",$ftgt11) == "6" OR check_feiertag($ftgt11)=="ja")
     {
     if (
check_feiertag($ftgt11)=="ja")
       {
       
$ftgt11 $ftgt11 86400;    
       }

     if (
date("w",$ftgt11) == "0")
       {
       
$ftgt11 $ftgt11 86400;
       }

     if (
date("w",$ftgt11) == "6")
       {
       
$ftgt11 $ftgt11 172800;    
       }

     if (
check_feiertag($ftgt11)=="ja")
       {
       
$ftgt11 $ftgt11 86400;    
       }

     if (
date("w",$ftgt11) == "0")
       {
       
$ftgt11 $ftgt11 86400;
       }

     if (
date("w",$ftgt11) == "6")
       {
       
$ftgt11 $ftgt11 172800;    
       }

     
array_push($fertigungstage$ftgt11);
     }
    else
     {
     
array_push($fertigungstage$ftgt11);
     }


   
$ftgt12 $ftgt11 86400;
   
   if (
date("w",$ftgt12) == "0" OR date("w",$ftgt12) == "6" OR check_feiertag($ftgt12)=="ja")
     {
     if (
check_feiertag($ftgt12)=="ja")
       {
       
$ftgt12 $ftgt12 86400;    
       }

     if (
date("w",$ftgt12) == "0")
       {
       
$ftgt12 $ftgt12 86400;
       }

     if (
date("w",$ftgt12) == "6")
       {
       
$ftgt12 $ftgt12 172800;    
       }

     if (
check_feiertag($ftgt12)=="ja")
       {
       
$ftgt12 $ftgt12 86400;    
       }

     if (
date("w",$ftgt12) == "0")
       {
       
$ftgt12 $ftgt12 86400;
       }

     if (
date("w",$ftgt12) == "6")
       {
       
$ftgt12 $ftgt12 172800;    
       }

     
array_push($fertigungstage$ftgt12);
     }
    else
     {
     
array_push($fertigungstage$ftgt12);
     }


   
$ftgt13 $ftgt12 86400;
   
   if (
date("w",$ftgt13) == "0" OR date("w",$ftgt13) == "6" OR check_feiertag($ftgt13)=="ja")
     {
     if (
check_feiertag($ftgt13)=="ja")
       {
       
$ftgt13 $ftgt13 86400;    
       }

     if (
date("w",$ftgt13) == "0")
       {
       
$ftgt13 $ftgt13 86400;
       }

     if (
date("w",$ftgt13) == "6")
       {
       
$ftgt13 $ftgt13 172800;    
       }

     if (
check_feiertag($ftgt13)=="ja")
       {
       
$ftgt13 $ftgt13 86400;    
       }

     if (
date("w",$ftgt13) == "0")
       {
       
$ftgt13 $ftgt13 86400;
       }

     if (
date("w",$ftgt13) == "6")
       {
       
$ftgt13 $ftgt13 172800;    
       }

     
array_push($fertigungstage$ftgt13);
     }
    else
     {
     
array_push($fertigungstage$ftgt13);
     }
  
   switch(
$fertigungszeit)
     {
     case 
"1":
       
$fertigung_bis $fertigungstage[0];    
       break;
     case 
"2":
       
$fertigung_bis $fertigungstage[1];    
       break;
     case 
"3":
       
$fertigung_bis $fertigungstage[2];    
       break;
     case 
"4":
       
$fertigung_bis $fertigungstage[3];    
       break;
     case 
"5":
       
$fertigung_bis $fertigungstage[4];    
       break;
     case 
"6":
       
$fertigung_bis $fertigungstage[5];    
       break;
     case 
"7":
       
$fertigung_bis $fertigungstage[6];    
       break;
     case 
"8":
       
$fertigung_bis $fertigungstage[7];    
       break;
     case 
"9":
       
$fertigung_bis $fertigungstage[8];    
       break;
     case 
"10":
       
$fertigung_bis $fertigungstage[9];    
       break;
     }

   return 
$fertigung_bis;
   } 
Wie Ihr schon seht, ist diese nicht sehr flexibel, was die tagesanzahl angeht. Momentan ist sie nur für 10 Tage ausgelegt...

Vielen Dank für Eure Hilfe im vorraus !

BP
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.10.2007, 20:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Statt durchnummerierten Variablen solltest du immer einen Array verwenden, dann kannst du den Code in einer Schleife mehrfach ausführen lassen.

Grundsätzlich rechnest du 10 Tage zum heutigen Datum so dazu:
echo date("l", strtotime("+10 days"));

10 Tage sind bei 5 Wochentagen pro Woche ganz einfach + 2 Kalenderwochen. Rechne also einfach
Code:
heute
+ abrunden(10 / 5) * 7 // unsere voll zu addierenden Wochen (2)
+ 10 % 5 // die restlichen Tage, die nicht komplett in einer Woche unterkamen, hier zufällig 0
(% ist Modulo-Rechnen, das heißt den Rest von 10/5 nehmen)
Wenn das Ergebnis auf ein Wochenende trifft (Samstag oder Sonntag), addiere 2 Tage hinzu.

Was ist Modulo?
http://de.php.net/manual/en/language...arithmetic.php
Datumsfunktionen:
http://de.php.net/date
http://de.php.net/strtotime
http://de.php.net/mktime
Zergling-new ist offline  
Alt 05.10.2007, 13:22  
bp158
Gast
 
Beiträge: n/a
Standard

Hi,

Zitat:
Wenn das Ergebnis auf ein Wochenende trifft (Samstag oder Sonntag), addiere 2 Tage hinzu.
hmm, bei einem samstag kann man zwei tage hinzuaddieren, bei einem sonntag aber nur einen ... (oder hab ich grad einen hänger ??)

hab jetzt jedenfalls mal ein wenig probiert ... rausgekommen ist das hier ...

PHP-Code:
$ftg_zeit 14;
$heute time();

$ftgz_tage = array();

$start time();

while(
count($ftgz_tage) < $ftg_zeit+1)
  {
  
// echo "count(ftgz_tage) = ".count($ftgz_tage)."
";
  // echo "
start $start ".date("d.m.Y",$start)."
";
  // echo "
---------------------------------------------------------------
";
  if (date("
w",$start) == "0" OR date("w",$start) == "6" OR check_feiertag($start))
     {
     if (check_feiertag($start))
       {
       $start = $start + 86400;    
       }
      
     if (date("
w",$start) == "0")
       {
       $start = $start + 86400;
       }

     if (date("
w",$start) == "6")
       {
       $start = $start + 172800;    
       }

     }
    else
     {
     array_push($ftgz_tage, $start);    
     $start = $start + 86400;
     }
 
  } 
Anschliessend kann ich das Array ja mit ftgz_tage[x] abfragen, wobei x = anzahl der gewünschten tage - 1 (weil array ja mit 0 beginnt) ist.

Find ich schon besser und Ihr ??

Thx

BP
 
Alt 05.10.2007, 13:47  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von bp158
hmm, bei einem samstag kann man zwei tage hinzuaddieren, bei einem sonntag aber nur einen ...
Nein, wenn ich zum Freitag 2 Tage hinzuaddiere sollte ja Dienstag (Sonntag + 2) und nicht Montag (Sonntag + 1) rauskommen.

Zitat:
Zitat von bp158
hab jetzt jedenfalls mal ein wenig probiert ... rausgekommen ist das hier ...
Ich versteh nicht warum du immernoch nicht auf deine Schleife verzichten willst. Was klappt denn an meinem Codebeispiel konkret nicht?
Zergling-new ist offline  
Alt 05.10.2007, 16:59  
bp158
Gast
 
Beiträge: n/a
Standard

Hi,

Zitat:
ch versteh nicht warum du immernoch nicht auf deine Schleife verzichten willst. Was klappt denn an meinem Codebeispiel konkret nicht?
naja, zB. Feiertagsberücksichtigung ??

BP
 
Alt 05.10.2007, 17:28  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Du hast doch gesagt ohne Berücksichtigung von (Bundes-)Feiertagen?! Naja wenns so läuft is ja auch OK.
Zergling-new ist offline  
Alt 05.10.2007, 19:08  
bp158
Gast
 
Beiträge: n/a
Standard

Hi,

ähm, da hab ich mich in meinem Urposting wohl ein wenig blöd ausgedrückt. ich hatte geschrieben:

Zitat:
... ist (nur Arbeitstage also Mo-Fr, keine Bundesfeiertage (können aus mysql-db kommen)) ??
damit meinte ich

erlaubte Tage = Arbeitstage (Mo-Fr)
nichterlaubte Tage = SA, SO, Bundesfeiertage

.... War wohl mein fehler, sorry.

Trotzdem Danke für Deine Hilfe !

BP
 
Alt 05.10.2007, 20:04  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Dein Algorithmus ist unlogisch, du prüfst ob Samstag Sonntag oder ein Feiertag ist, wenn ja prüfst du nochmal einzeln ob es ein Feiertag ist und machst Aktion X, wenn Samstag ist, machste Aktion Y, wenn Sonntag ist Aktion Z (die identisch mit Aktion Y sein sollte).

Und hast du schonmal dran gedacht, dass ein Feiertag auch auf Samstag oder Sonntag fallen kann? (wenn nicht, vertausch die Reihenfolge, also erst auf Wochenende prüfen, danach (else) erst auf Feiertag)

Alles in allem ist dein Algorithmus also etwas schlampig.


Nochmal eine letzte Empfehlung, ob du sie beherzigst bleibt dann dir überlassen:

Mach es wie ich erwähnt habe; prüfe am Ende jedoch noch nicht auf Sams- und Sonntage! Schreib dir eine Funktion, die Start- und Enddatum übergeben bekommt und als Ergebnis die Anzahl der in diesem Zeitraum liegenden Feiertage (die nicht auf einen Samstag oder Sonntag fallen) liefert.

Code:
getHolidayCount($startdate, $enddate)
Das könnte so aussehen:
Code:
SELECT COUNT(*) FROM holidays WHERE (holiday BETWEEN '$startdate' AND '$enddate') AND DAYOFWEEK(holiday ) NOT IN(1, 7)
http://dev.mysql.com/doc/refman/5.0/...tion_dayofweek

Diese Anzahl addierst du auf das Ergebnis drauf und prüfst jetzt erst, ob Samstag oder Sonntag. Wenn ja, wie erwähnt plus 2.

Wenn du das Prinzip verstanden hast und keinen Denkfehler gefunden hast, sollte es ein sehr effizienter Algorithmus sein (~ 10 Zeilen vs deine 646 Zeilen).

Wenn du ihn nicht verstanden hast, sag mir Bescheid ob ich noch einmal etwas erklären soll oder ob ich mir das sparen kann, weil du lieber deinen (hoffentlich verbesserten) Code verwenden möchtest.
Zergling-new ist offline  
Alt 06.10.2007, 10:36  
bp158
Gast
 
Beiträge: n/a
Standard

Moin,

Zitat:
Dein Algorithmus ist unlogisch, du prüfst ob Samstag Sonntag oder ein Feiertag ist, wenn ja prüfst du nochmal einzeln ob es ein Feiertag ist und machst Aktion X, wenn Samstag ist, machste Aktion Y, wenn Sonntag ist Aktion Z (die identisch mit Aktion Y sein sollte).
ok, das mit SO || Feiertag könnte man zusammenlegen. die erste abfrage ist ja bloss um überhaupt zu checken, ob es ein SA, SO oder FT ist ...

Zitat:
Und hast du schonmal dran gedacht, dass ein Feiertag auch auf Samstag oder Sonntag fallen kann? (wenn nicht, vertausch die Reihenfolge, also erst auf Wochenende prüfen, danach (else) erst auf Feiertag)
ok, ist getauscht. aber das spielt doch denke ich mal keine rolle, da ja so oder so immer eien tag (oder zwei) weitergerutscht wird.

Zitat:
Nochmal eine letzte Empfehlung, ob du sie beherzigst bleibt dann dir überlassen:

Mach es wie ich erwähnt habe; prüfe am Ende jedoch noch nicht auf Sams- und Sonntage! Schreib dir eine Funktion, die Start- und Enddatum übergeben bekommt und als Ergebnis die Anzahl der in diesem Zeitraum liegenden Feiertage (die nicht auf einen Samstag oder Sonntag fallen) liefert.
naja, das startdatum hab ich ja (heute) aber das enddatum will ich ja wissen ... also ist es schlecht mit übergeben ... ich habe lediglich die anzahl der tage (also zwischen 2 und vierzehn tagen) ...

Zitat:
Wenn du das Prinzip verstanden hast und keinen Denkfehler gefunden hast, sollte es ein sehr effizienter Algorithmus sein (~ 10 Zeilen vs deine 646 Zeilen).
über den code aus meinem ersten posting brauchen wir nicht diskutieren, das war schlicht und einfach müll. deshalb will/wollte ich es ja auch verbessern ...

Zitat:
Wenn du ihn nicht verstanden hast, sag mir Bescheid ob ich noch einmal etwas erklären soll oder ob ich mir das sparen kann, weil du lieber deinen (hoffentlich verbesserten) Code verwenden möchtest.
ich werde mich jetzt nochmal dran machen, mit deinem code zu experimentieren ! melde mich später nochmal.

Bis hierher schonmal ein großes Dankeschön !

BP
 
Alt 06.10.2007, 13:20  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von bp158
ok, das mit SO || Feiertag könnte man zusammenlegen. die erste abfrage ist ja bloss um überhaupt zu checken, ob es ein SA, SO oder FT ist ...
Ja das ist schon klar, nur
Code:
if (eins | zwei | drei) {
  if (eins) {
    // ..
  }
  if (zwei) {
    // ..
  }
  if (drei) {
    // ..
  }
}
ist halt nur suboptimal

Zitat:
Zitat von bp158
Zitat:
Und hast du schonmal dran gedacht, dass ein Feiertag auch auf Samstag oder Sonntag fallen kann? (wenn nicht, vertausch die Reihenfolge, also erst auf Wochenende prüfen, danach (else) erst auf Feiertag)
ok, ist getauscht. aber das spielt doch denke ich mal keine rolle, da ja so oder so immer eien tag (oder zwei) weitergerutscht wird.
Doch es ist wichtig zu wissen, ob ein Feiertag aufs Wochenende fällt oder nicht.

Zitat:
Zitat von bp158
Zitat:
Nochmal eine letzte Empfehlung, ob du sie beherzigst bleibt dann dir überlassen:

Mach es wie ich erwähnt habe; prüfe am Ende jedoch noch nicht auf Sams- und Sonntage! Schreib dir eine Funktion, die Start- und Enddatum übergeben bekommt und als Ergebnis die Anzahl der in diesem Zeitraum liegenden Feiertage (die nicht auf einen Samstag oder Sonntag fallen) liefert.
naja, das startdatum hab ich ja (heute) aber das enddatum will ich ja wissen ... also ist es schlecht mit übergeben ... ich habe lediglich die anzahl der tage (also zwischen 2 und vierzehn tagen) ...
Nein, du hast mit der Formel
Code:
TAG_X + abrunden(ANZAHL / 5) + (ANZAHL % 5)
bereits ein (nicht das) Enddatum. Jetzt schaust du wie gesagt mit dem SQL-Schnipsel, wieviel Feiertage in diesem Zeitraum (start=TAG_X, ende=Formel-Ergebnis) liegen, die nicht auf ein Wochenende fallen. Die Anzahl gefundener Feiertage addierst du drauf. Wenn das Ergebnis jetzt auf ein Wochenende fällt, addiere 2 Tage dazu.
Und jetzt kommt noch ein Spezialfall, denn nun musst du schauen, ob in den zusätzlich durch die Feiertage hinzugekommenen Tagen nicht auch noch ein Feiertag versteckt ist.

Ich schreib dir hier mal einen Algorithmus, der hoffentlich funktioniert!

PHP-Code:
<?php
// weekday = monday - friday
// weekendday = saturday, sunday
// @param int $day unix timestamp
// @param int $weekdays amount of weekdays (mon-fri) to add
function getDateByWeekdayAddition($day$weekdays)
{
  
// we need a weekday
  
if (isSaturday($day)) {
    
$day += 172800// 2 * 24 * 60 * 60 = 2 days
  
} else if (isSunday($day)) {
    
$day += 86400// 1 * 24 * 60 * 60 = 1 day
  
}
  
$start $day;
  
$end $day floor($weekdays 5) * 604800 + ($weekdays 5) * 86400// 604800  = 7 * 24 * 60 * 60 = 1 week
  
$holidays 0;
  do {
    if (
$holidays 0) {
      
$start $end;
      
$end += $holidays  86400;
    }
    if (
isWeekendday($end)) {
      
$end += 172800;
    }
  } while ((
$holidays getHolidayCount($start$end)) > 0);
  return 
$end;
}

function 
isSaturday($date)
{
  return 
date("w"$date) == 6;
}
function 
isSunday($date)
{
  return 
date("w"$date) == 0;
}
function 
isWeekendday($date)
{
  return 
isSaturday($date) || isSunday($date);
}
function 
isWeekday($date)
{
  return !
isWeekendday($date);
}

function 
getHolidayCount($date)
{
  
$date date("Y-m-d"$date); // get needed format
  
$sql "SELECT COUNT(*) FROM holidays WHERE (holiday BETWEEN '$startdate' AND '$enddate') AND DAYOFWEEK(holiday) NOT IN(1, 7)";
  
$res mysql_query($sql) or die(mysql_error());
  return 
mysql_result($res0);
}
?>
(ungetestet; parameter sind jeweils Unix-Timestamps)

gut zugegebenermaßen nicht mehr ganz so kurz aber dafür übersichtlich unterteilt. Probleme bzw. suboptimal wird der Algorithmus nur, wenn du auf eine Kette von Feiertagen springst, z.B. auf den Samstag, wenn Montag, Dienstag, Mittwoch Weihnachten ist.
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Tage, Stunden und Minuten berechnen christian1112 PHP Tipps 2008 10 02.03.2009 12:38
Durschnitt berechnen schimanski Datenbanken 6 04.06.2008 15:47
Statistik zu welchem Zeitpunkt berechnen? cycap Datenbanken 10 13.10.2007 12:19
entfernung mittels plz berechnen kid01 PHP-Fortgeschrittene 10 13.10.2006 17:53
[Erledigt] Sporttabelle aus Ergebnissen berechnen Datenbanken 6 13.03.2006 20:37
Farbnuancen aus Farbton berechnen PHP Tipps 2005-2 1 24.10.2005 15:24
Ausgabetabelle berechnen GN PHP Tipps 2005-2 1 03.09.2005 02:57
[Erledigt] Distanz zwischen zwei Bild-Koordinaten berechnen - Machbar? PHP-Fortgeschrittene 4 28.08.2005 17:29
menschenalter berechnen janni PHP Tipps 2005 6 25.05.2005 00:13
[Erledigt] Restzeit berechnen PHP Tipps 2005 10 22.04.2005 13:02
kapazität berechnen PHP Tipps 2005 7 10.01.2005 20:25
Help, Zahlen aus DB berechnen PHP Tipps 2004-2 6 29.12.2004 17:55
KFZ Haftpflicht Versicherungsprämie berechnen Beitragsarchiv 3 13.12.2004 09:12
Phi berechnen - Euler Funktion Beitragsarchiv 6 02.12.2004 07:38
mit PHP traffic berechnen oder schätzen PHP Tipps 2004 2 21.06.2004 12:59

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php arbeitstage berechnen, php arbeitstage, arbeitstage berechnen, arbeitstage 2009 nrw, sql arbeitstage, arbeitstage 2009 berechnen, fertigungszeiten berechnen, mysql arbeitstage, kalender 2005 arbeitstage, arbeitstage 2005, sql arbeitstage berechnen, kalender 2004 arbeitstage, kalender 2007 arbeitstage, arbeitstage php, sql werktage berechnen, arbeitstage berechnen php, arbeitstage nrw 2009, kalender 2006 arbeitstage, arbeitstage 2008 nrw, nur werktage mysql

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:07 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.