Werktage über mehrere Monate berechnen!

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    so, hab es nun in eine while - schleife gesetzt.

    PHP-Code:
    $startdatum=mktime(0,0,0,$Monat,$Tag,$Jahr);
    $enddatum=mktime(0,0,0,$MonatEnde,$TagEnde,$JahrEnde);

    while(
    $startdatum<=$enddatum){
      
    $startdatum++;
      
    $test=date("d.m.Y"$startdatum);
      echo 
    "$test<br>";

    Wenn ich jetzt über das ganze mal nachdenke, fällt mir jetzt noch was dazu ein:

    mit folgender funktion lese ich ja die Tage eines Monats heraus:
    PHP-Code:
    function ArbeitstageErmitteln($Jahr$Monat$Tag$JahrEnde$MonatEnde$TagEnde)

      for(
    $i=1$i<=date("t"mktime(000$Monat$Tag$Jahr)); $i++)
        {
        if(
    date("w"mktime(000$Monat$i$Jahr))!=&& date("w"mktime(000$Monat$i$Jahr))!=6)
          {
          
    $Anzahl++;
          }
        }
      return 
    $Anzahl;

    So, nun habe ich einen ganz anderen DENK-ANSATZ.

    Grund dafür ist, dass ich die Werktage eines Ausgewählten Zeitraumes benötige. Diesen Code habe ich mir jetzt zusammengestellt.

    PHP-Code:
    $startdatum=mktime(0,0,0,$Monat,$Tag,$Jahr);
    $enddatum=mktime(0,0,0,$MonatEnde,$TagEnde,$JahrEnde);

    $start_wday date('w',$startdatum);
    $end_wday date('w',$enddatum);

    $weeks date('W',$enddatum $startdatum);
    $days date('z',$enddatum $startdatum);

    if(
    $start_wday $end_wday) { 
      
    $w_days $days - ($weeks 2);
    }
    else 
    $w_days $days - (($weeks 1) * 2);

    //----- FEIERTAGE -----
    $faktor=0;
    while(
    true)
    {
     if((
    $startdatum+(86400*$faktor))>$enddatum)
     {
      break;
     }
     else
     {
      foreach(
    $feiertage as $feiertag)
      {
       
    $feiertag=explode(".",$feiertag);
       
    $feiertag mktime(0,0,0,$feiertag[1],$feiertag[0],$feiertag[2]);
       if((
    $startdatum+(86400*$faktor))==$feiertag)
       {
        if(
    date("l" ,$feiertag)!="Sunday" && date("l" ,$feiertag)!="Saturday")
        {
        
    $w_days--;
        }
       }
      }
      
    $faktor++;
     }
    }
    echo 
    "$w_days<br>"
    So, ich bekomme jetzt anhand diesen codes einen Wert von 255 heraus.
    Es müsste aber 248 sein.
    WARUM

    Es gibt 260 Werktage. (abzüglich Wochenende)
    Wir haben 18 Urlaubstage im Jahr (Österreich)
    Davon sind genau 6 Urlaubstag im Jahr 2006, die in ein Wochenende fallen.
    12 Urlaubstage sind fürs Jahr 2006 unter der Woche.

    Somit müssten die 12 Urlaubstage von den 260 Werktagen abgezählt werden.

    Ich komm nicht dahinter.
    Zuletzt geändert von m-werk; 13.12.2006, 10:34.
    LG, m-werk

    Kommentar


    • #17
      Ich kappier das einfach jetzt nicht mehr. Folgender Code funktioniert, wenn ich jeden Monat einzelln abrechnen lasse, richtig. Da stimmt einfach alles.

      Wenn ich aber über das ganze Jahr die Berechnung laufen lasse, stimmt der Wert der wirklichen Werktage nicht.

      Ich weiss jetzt einfach nicht mehr weiter.
      PHP-Code:
      <?php
      include("feiertage_rechnen.php");
      $Jahr=2006;
      $Monat=1;
      $Tag=1;
      $JahrEnde=2006;
      $MonatEnde=12;
      $TagEnde=31;

      $startdatum=mktime(0,0,0,$Monat,$Tag,$Jahr);
      $enddatum=mktime(0,0,0,$MonatEnde,$TagEnde,$JahrEnde);

      $date1 $Jahr."-".$Monat."-".$Tag;
      $date2 $JahrEnde."-".$MonatEnde."-".$TagEnde;

      function 
      x($date1$date2) {
          
      $ts1 strtotime($date1);
          
      $ts2 strtotime($date2);
          if(
      $ts1 <= || $ts2 <= 0) return false;
          if(
      $ts2 $ts1) {
              
      $f = -1;
              list(
      $ts1$ts2) = array($ts2$ts1);
          }
          else {
              
      $f 1;
          }
          
      $ts1 mktime(3,0,0,date("m"$ts1),date("d"$ts1), date("Y"$ts1));
          
      $ts2 mktime(3,0,0,date("m"$ts2),date("d"$ts2), date("Y"$ts2));
          
      $wd 0;
          while(
      $ts1 <= $ts2) {
              if( 
      date("w"$ts1) != && date("w"$ts1) != $wd++;
              
      $ts1 += 86400;
          }
          return 
      $f * ($wd );
      }
      $test=x($date1$date2);
      echo 
      "$test"." = Tage abzüglich Wochenenden<br>"

      //--- Feiertagsberechnung ---
      $faktor=0;
      while(
      true)
      {
       if((
      $startdatum+(86400*$faktor))>$enddatum)
       {
        break;
       }
       else
       {
        foreach(
      $feiertage as $feiertag)
        {
         
      $feiertag=explode(".",$feiertag);
         
      $feiertag mktime(0,0,0,$feiertag[1],$feiertag[0],$feiertag[2]);
         if((
      $startdatum+(86400*$faktor))==$feiertag)
         {
          if(
      date("w" ,$feiertag)!=&& date("w" ,$feiertag)!=6)
          {
          
      $test--;
          }
         }
        }
        
      $faktor++;
       }
      }
      echo 
      "$test"." = Tage abzüglich Feiertage und Wochenenden<br>";
      echo 
      "$faktor"." = Tage im Monat<br>";
      ?>
      Was stimmt da nicht, ich komm nicht drauf.

      Es muss bei dieser datumsangabe bei $test=248 herauskommen. Es kommt aber immer 255 Heraus.

      Ich weiss jetzt nicht mehr, was da noch falsch sein kann. Wie gesagt, wenn ich bei den Datumsangaben das Monat für Monat mache, dann stimmt die Berechnung.
      LG, m-werk

      Kommentar


      • #18
        PHP-Code:
        <?
        error_reporting(E_ALL);
        /* the dates MUST have the following construction: "01.12.2008" or "1.12.2008"
           examplar: getWorkdays("1.12.2006","17.12.2006",$feiertage);                 */


        $feiertage=array("25.12.2006","26.12.2006");
        function getWorkdays($start, $end, $holidays){ 
         if(!preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$start) || 
        !preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$end)){$error=1;}
         if(empty($error)){
          $workdays = 0;
          $start = explode(".",$start);
          $end = explode(".",$end);
          $s_d = (int)$start[0];
          $s_M = (int)$start[1];
          $s_y = (int)$start[2];
          $e_d = (int)$end[0];
          $e_M = (int)$end[1];
          $e_y = (int)$end[2];
          $s_t = mktime(3,0,0,$s_M,$s_d,$s_y);
          $e_t = mktime(3,0,0,$e_M,$e_d,$e_y);
          for($i=0;$i<count($holidays);$i++){
           $t_f = explode(".",$holidays[$i]);
           $holidays[$i] = mktime(0,0,0,(int)$t_f[1],(int)$t_f[0],(int)$t_f[2]);
          }
          if($s_t<=$e_t){
           for($i=0;$i*86400+$s_t<=$e_t;$i++){
            if(!in_array(date("w",$i*86400+$s_t),array(0,6)) && !in_array($i*86400+$s_t,$holidays)){
             $workdays++;
            }
           }
           return $workdays;
          }else{
           echo "invalid input<br>\$start-\$end mustn't be negative";
          }
         }else{
          echo "invalid date construction<br>";
         }
        }

        echo getWorkdays("1.1.2006","31.12.2006",$feiertage);
        ?>
        versuchs mal damit.
        Die Feiertage habe ich oben definiert di kannst du natürlich auch streichen und mit einem include einfügen.
        Zuletzt geändert von jmc; 14.12.2006, 13:16.

        Kommentar


        • #19
          Danke für den Code, hab alles was $holidays war auf $feiertage ausgebessert. Es kommt aber, wenn ich diesen ausführe, immer die Meldung: invalid date construction

          da stimmt noch was nicht oder mach ich was falsch?
          LG, m-werk

          Kommentar


          • #20
            Naja, vielleicht liegts auch an meiner Feiertags-Datei.

            der Code dafür sieht so aus:
            PHP-Code:
            $Jahr=date("Y");

            $neujahr=date("d.m.Y"mktime(0,0,0,1,1,$Jahr));
            $h3k=date("d.m.Y"mktime(0,0,0,1,6,$Jahr));
            $ostersamstag=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
                          
            date("d"easter_date($Jahr))-1date("Y"easter_date($Jahr))));
            $ostern=date ("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
                    
            date("d"easter_date($Jahr)), date("Y"easter_date($Jahr)))); 
            $ostermontag=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
                         
            date("d"easter_date($Jahr))+1date("Y"easter_date($Jahr))));
            $christi=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
                     
            date("d"easter_date($Jahr))+39date("Y"easter_date($Jahr))));
            $pfingsts=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)), 
                      
            date("d"easter_date($Jahr))+49date("Y"easter_date($Jahr))));
            $pfingstm=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)), 
                      
            date("d"easter_date($Jahr))+50date("Y"easter_date($Jahr))));
            $fronleich=date("d.m.Y"mktime(0,0,0,date("m"easter_date($Jahr)),
                       
            date("d"easter_date($Jahr))+60date("Y"easter_date($Jahr))));
            $staat=date("d.m.Y"mktime(0,0,0,5,1,$Jahr));
            $maria=date("d.m.Y"mktime(0,0,0,8,15,$Jahr));
            $national=date("d.m.Y"mktime(0,0,0,10,26,$Jahr));
            $allerheiligen=date("d.m.Y"mktime(0,0,0,11,1,$Jahr));
            $maria2=date("d.m.Y"mktime(0,0,0,12,8,$Jahr));
            $heilig=date("d.m.Y"mktime(0,0,0,12,24,$Jahr));
            $christ=date("d.m.Y"mktime(0,0,0,12,25,$Jahr));
            $stef=date("d.m.Y"mktime(0,0,0,12,26,$Jahr));
            $silv=date("d.m.Y"mktime(0,0,0,12,31,$Jahr));

            $feiertage=array($neujahr,$h3k,$ostersamstag,$ostern,$ostermontag,$christi,$pfingsts,
            $pfingstm,$fronleich,$staat,$maria,$national,$allerheiligen,$maria2,$heilig,
            $christ,$stef,$silv); 
            Kann es sein, dass ich da einen fehler drinn habe?

            EDIT:

            hab mir erlaubt, den code nochmals hineinzustellen. hab ihn jetzt auch runtergebrochen so dass er nicht zu breit ist.

            Ich hoffe, es passt so

            Zuletzt geändert von m-werk; 14.12.2006, 08:44.
            LG, m-werk

            Kommentar


            • #21
              das geht so nicht... holidays müssen holidays bleiben. Das ist eine Variabel innerhalb der Funktion. Die Feiertage werden durch den Funktionsaufruf übergeben.

              Hier nochmals ein Script
              PHP-Code:
              <?
              error_reporting(E_ALL);
              /* the dates MUST have the following construction: "01.12.2008" or "1.12.2008"
                 examplar: getWorkdays("1.12.2006","17.12.2006");                            */

              function getWorkdays($start, $end){
               if(preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$start) || preg_match("/^\d{1,2}\.\d{1,2}\.\d{1,4}$/",$end)){
                $workdays = 0;
                $start = explode(".",$start);
                $end = explode(".",$end);
                $s_d = (int)$start[0];
                $s_M = (int)$start[1];
                $s_y = (int)$start[2];
                $e_d = (int)$end[0];
                $e_M = (int)$end[1];
                $e_y = (int)$end[2];
                if(mktime(0,0,0,$s_M,$s_d,$s_y)<=mktime(0,0,0,$e_M,$e_d,$e_y)){
                 for($i=0;mktime(0,0,0,$s_M,$i+$s_d,$s_y)<=mktime(0,0,0,$e_M,$e_d,$e_y);$i++){
                  if(!in_array(date("w",mktime(0,0,0,$s_M,$i+$s_d,$s_y)),array(0,6)) && 
              !in_array(mktime(0,0,0,$s_M,$i+$s_d,$s_y),get_holidays(mktime(0,0,0,$s_M,$i+$s_d,$s_y)))){
                   $workdays++;
                  }
                 }
                 return $workdays;
                }else{
                 return "invalid input<br>\$start-\$end mustn't be negative";
                }
               }else{
                return "invalid date construction<br>";
               }
              }
              function get_holidays($year){
               $year = date("Y",$year);
               $newyear = mktime(0,0,0,1,1,$year);
               $h3k = mktime(0,0,0,1,6,$year);
               $ostersamstag = easter_date($year)-86400;
               $ostern = easter_date($year); 
               $ostermontag = easter_date($year)+86400;
               $christi = easter_date($year)+39*86400;
               $pfingsts = easter_date($year)+49*86400;
               $pfingstm = easter_date($year)+50*86400;
               $fronleich = easter_date($year)+60*86400;
               $staat = mktime(0,0,0,5,1,$year);
               $maria = mktime(0,0,0,8,15,$year);
               $national = mktime(0,0,0,10,26,$year);
               $allerheiligen = mktime(0,0,0,11,1,$year);
               $maria2 = mktime(0,0,0,12,8,$year);
               $heilig = mktime(0,0,0,12,24,$year);
               $christ = mktime(0,0,0,12,25,$year);
               $stef = mktime(0,0,0,12,26,$year);
               $silv = mktime(0,0,0,12,31,$year);

               return array($newyear,$h3k,$ostersamstag,$ostern,$ostermontag,$christi,$pfingsts,$pfingstm,
              $fronleich,$staat,$maria,$national,$allerheiligen,$maria2,$heilig,$christ,$stef,$silv);
              }

              echo getWorkdays("1.1.2006","31.12.2006"); // Ausgabe 248

              ?>
              PS: Backslashes verschwinden im FOrum. Drücke auf Zitat um den ganzen Code zu erhalten.
              Zuletzt geändert von jmc; 14.12.2006, 13:21.

              Kommentar


              • #22
                SPITZE, GENAU DAS WASS ICH WOLLTE.

                DAS FUNKTIONIERT JETZT.


                DANKE
                LG, m-werk

                Kommentar


                • #23
                  Eine kleinigkeit brächte ich da noch.

                  Wie kriege ich jetzt aus der holiday funktion die Tage aufgelistet am Schirm?

                  hab schon einiges versucht. Komm nicht dahinter.
                  LG, m-werk

                  Kommentar


                  • #24
                    alle freien Tage ausser den Sonntagen und Samstagen, die innerhalb der Zeitspanne sind?

                    Kommentar


                    • #25
                      ne, ich bräuchte das Datum. ich möchte das datum der einzellnen Feiertage einerseits vom ganzen Jahr sehen und andererseits möchte ich z.b. nur den $silv sehen.
                      LG, m-werk

                      Kommentar


                      • #26
                        PHP-Code:
                        $array get_holidays(hier_die_jahreszahl);
                        for(
                        $i=0;$i<count($array);$i++){
                        $array[$i] = date("D j F Y",$array[$i])
                        }
                        print_r($array); 
                        um das Datum der einzelnen rauszufinden müsste ich wissen wofür, damit ich etwas so anpassen kann.

                        Kommentar


                        • #27
                          Ich möchte immer das Silvesterdatum auf der Seite angezeigt haben.

                          Es geht darum:
                          Ich gebe das Datum ein, wann ein Mitarbeiter in das Unternehmen kommt.

                          Nun möchte ich immer wissen, wieviele Arbeitstage er bis Jahresende hat.

                          Ich habe den Code schon so umgebaut, (war nicht viel zu tun, so dass das $start schon mit den richtigen Startdatum, welches ich eingebe, befüllt wird. Ich möchte nicht das Enddatum auch fix hinterlegen, da ich nicht jedes Jahr das Datum ändern möchte.

                          Darum geht's eigentlich.
                          LG, m-werk

                          Kommentar


                          • #28
                            Kannst du eigentlich überhaupt irgendwas selber ...?
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #29
                              habs gelöst, danke für eure hilfe und unterstützung.
                              LG, m-werk

                              Kommentar

                              Lädt...
                              X