Ankündigung

Einklappen
Keine Ankündigung bisher.

Feiertags-Funktion Optimieren

Einklappen

Neue Werbung 2019

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

  • Feiertags-Funktion Optimieren

    Hallo Leute,
    ich bastel für meinen Shop an einer Funktion um den Liefertag zu berechnen,
    dabei sollen die Deutschlandweiten Feiertage berücksichtigt werden.

    Meine Frage?
    Mir geht es darum neue Denkanstöße zu bekommen um den Code zuverbessern
    da mir bei den Datums funktionen der kopf raucht

    PHP-Code:
    if (!isset($xtPlugin->active_modules['sc_shippingtime'])){
        
    $show_box false;} else {
    global 
    $page;
    $timeAct time()+10800;
    $today getdate();
    $stunde $today['hours'];
    $min $today['minutes'];
    $aStunde = ("$stunde.$min");
    $tag $today['mday'];
    $weekday $today['weekday'];
    $monat $today['mon'];  
    $jahr $today['year'];

     
       
    // Parameter in richtiges Format bringen
       
    if(strlen($tag) == 1) {
          
    $tag "0$tag";
       }
       if(
    strlen($monat) == 1) {
          
    $monat "0$monat";
       }
     
       
    // Wochentag berechnen
       
    $datum getdate(mktime(000$monat$tag$jahr));
       
    $wochentag $datum['wday'];
       
     
       
    // PrĂ¼fen, ob Wochenende und Zeitfenster setzen   
           
    if($wochentag == 0) {$limit 'true';
    } elseif (
    $wochentag == 6) {$sTimeLimit 9;
      } else {
    $sTimeLimit 15$inwoche 'ja';}
      
      
    //Vergangenne Zeit vom Limit bis 24 UHR
      
    $timeActH strftime('%H'$timeAct);
      
    $timeActM strftime('%M'$timeAct);
      
    $timeActUnix mktime($timeActH,$timeActM,0,0,0,0);
      
    $sTimeLimitUnix =    mktime($sTimeLimit,0,0,0,0,0);
      
    $timeAfterLimit = ($timeActUnix-$sTimeLimitUnix);
      

     
       
    // Feste Feiertage werden nach dem Schema ddmm eingetragen
       
    $feiertage[] = "0101"// Neujahrstag
       
    $feiertage[] = "0105"// Tag der Arbeit
       
    $feiertage[] = "0310"// Tag der Deutschen Einheit
       
    $feiertage[] = "2512"// Erster Weihnachtstag
       
    $feiertage[] = "2612"// Zweiter Weihnachtstag
     
       // Bewegliche Feiertage berechnen
       
    $tage 60 60 24;
       
    $ostersonntag easter_date($jahr);
       
    $feiertage[] = date("dm"$ostersonntag $tage);  // Karfreitag
       
       
    $feiertage[] = date("dm"$ostersonntag $tage);  // Ostermontag
       
       
    $feiertage[] = date("dm"$ostersonntag 39 $tage); // Himmelfahrt
       
    $feiertage[] = date("dm"$ostersonntag 50 $tage); // Pfingstmontag
       
       
     
       // PrĂ¼fen, ob Feiertag true false
       
    $code $tag.$monat;
       if(
    in_array($code$feiertage)) {
          
    $feiertag 'ja';
       } else {
          
    $feiertag 'nein';
       }

     
    // Maindays auf Aktuelle Zeit setzen und Lieferzeitberechnung
       
    $manidays $timeAct;
       
    $vergangeneZeit 60*60*$stunde;
       if(
    $sTimeLimit <= $aStunde){$limit 'true';} else {$limit 'false';}
       
            if(
    $feiertag == 'nein' && $limit == 'false'){    
            switch (
    $wochentag) {
        case 
    5:
            
    $LieferdatumUnix $manidays 86400  $vergangeneZeit;
            break;
        case 
    6:
            
    $LieferdatumUnix $manidays 172800  $vergangeneZeit;
            break;
        case 
    0:
            
    $LieferdatumUnix $manidays 172800  $vergangeneZeit;
            break;
        default:
           
    $LieferdatumUnix $manidays 86400  $vergangeneZeit;
    }    }    

    if(
    $feiertag == 'nein' && $limit == 'true'){    
            switch (
    $wochentag) {
        case 
    5:
            
    $LieferdatumUnix $manidays 259200  $vergangeneZeit;
            break;
        case 
    6:
            
    $LieferdatumUnix $manidays 259200  $vergangeneZeit;
            break;
        case 
    0:
            
    $LieferdatumUnix $manidays 172800  $vergangeneZeit;
            break;
        default:
           
    $LieferdatumUnix $manidays 172800  $vergangeneZeit;
    }    }    

    if(
    $feiertag == 'ja'){    
            switch (
    $wochentag) {
        case 
    5:
            
    $LieferdatumUnix $manidays 432000  $vergangeneZeit;
            break;
        case 
    6:
            
    $LieferdatumUnix $manidays 345600  $vergangeneZeit;
            break;
        case 
    0:
            
    $LieferdatumUnix $manidays 259200  $vergangeneZeit;
            break;
        default:
           
    $LieferdatumUnix $manidays 172800  $vergangeneZeit;
    }    }                                                                                                         
       
        
    // Zeitlimit fĂ¼r Bestellung berechnen
        
    $orderTimelimit = (60*60*$sTimeLimit) - $timeAct;


     
     
    $Lieferdatum utf8_encode(strftime('%A, %d. %B'$LieferdatumUnix));
     
    $orderTimelimitH strftime('%H'$orderTimelimit);
     
    $orderTimelimitM strftime('%M'$orderTimelimit);

      if(
    $orderTimelimitH[0] == 0){$orderTimelimitH substr($orderTimelimitH, -1);}
      if(
    $orderTimelimitM[0] == 0){$orderTimelimitM substr($orderTimelimitM, -1);}
      
    $Page_nombre $page->page_name;
    $tpl_data = array('feiertag'=>$feiertag,'Lieferdatum'=>$Lieferdatum,'HLimit'=>$orderTimelimitH,'MLimit'=>$orderTimelimitM'Page_nombre'=>$Page_nombre);
    $show_box true;} 


  • #2
    Hier ein paar Anregungen.
    Größtenteils [MAN]strtotime [/MAN]und [MAN]date[/MAN]
    Und Boolean ist ein Datentyp, der sich das Ausdenken von Strings, die eine 0 oder 1 repräsentieren überflüssig macht!

    Bei [MAN]date[/MAN] musst du dir die Formatierungen anschauen und verinnerlichen. Die braucht man immer wieder.
    [MAN]DateTime[/MAN] wäre auch eine alternative.

    edit:
    Feiertag verändert die Lieferzeit bei dir scheinbar um einen Tag (Dabei behandelst du übrigens nicht wieviele Feiertage aufeinander folgen, falls es das gibt).
    Die Lieferzeitverlängerung um einen Tag, wenn heute ein Feiertag ist, macht da mehr Sinn und ist auch verständlicher.

    Was Limit macht weiß ich nicht, aber schön wäre die Auflösung des weiteren switch case Blocks

    PHP-Code:
    $today date(); 
    $stunde date('H'); 
    $min date('i'); 
    $aStunde date('H.i'); 
    $tag $today['mday']; //Ich weiß grade nicht was das ist 
    $weekday $today['weekday'];
    $monat date('m');   
    $jahr date('Y'); 

      
       
    // Parameter in richtiges Format bringen ist überflüssig

      
       // Wochentag berechnen 
       //Siehe date Funktion
       
    $datum getdate(mktime(000$monat$tag$jahr)); 
       
    $wochentag $datum['wday']; 
       
       
       
    //...
       
    $code $tag.$monat
       
    //Lass es ruhig ein boolean sein. Tut niemandem weh.
       
    $feiertag in_array($code$feiertage);
       
       
    //....
       
    $manidays $timeAct
    $time strtotime('-'.$stunde.' hours',$manidays);
    //Limit will auch ein Boolean sein.
    $limit $sTimeLimit <= $aStunde;
    if(!
    $limit){     
    switch (
    $wochentag) { 
        case 
    5
            
    $LieferdatumUnix strtotime('+1 days',$time); 
        break; 
        case 
    6//case 6 und 0 machen das gleiche
        
    case 0
            
    $LieferdatumUnix strtotime('+2 days',$time); 
        break; 
        default: 
            
    $LieferdatumUnix strtotime('+1 days',$time); 
    }
    }
    if(
    $feiertag)
    $LieferdatumUnix strtotime('+1 days',$LieferdatumUnix); 
    War der Beitrag hilfreich? Dann Bedank dich mit einem klick auf .

    Kommentar


    • #3
      ... Denkanstöße zu bekommen ... da mir bei den Datums funktionen der kopf raucht
      Denkanstoß.. Hmm.. Also ich wüßte da jetzt ehrlich nicht was ich mit so einer "Frage" schreiben/helfen sollte.

      Das es jede Menge dazu im web gibt (google "php feiertage ...") hast du ja schon gesehen, zumindest ist der erste Treffer deinem Code sehr ähnlich Kann es sein das du das/etwas in deinen Code "reinkopiert" hast und dich jetzt nicht mehr auskennst?

      Hast du ev. eine konkrete Frage, dann kann man sicher auch besser helfen als so. Denn so ist es ja quasi ein "wer schreibt mir meinen Code (um)".

      Denkanstöße ...
      - Lagere den Code mehr in Funktionen aus.

      - Und besser nur mit der "neuen" DateTime-Klasse von PHP arbeiten, die kann mehr bzw. ist flexibler in der Anwendung (meine Meinung) und hat das Unix-Problem (oder wie das heißt) nicht. Das hier mein ich http://de.wikipedia.org/wiki/Jahr-2038-Problem. Aus dem Grund sollte man von den "alten" date(), mktime(), strtotime() etc.. Funktionen besser gleich die Finger lassen.

      LG
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von giller Beitrag anzeigen
        Mir geht es darum neue Denkanstöße zu bekommen um den Code zuverbessern
        da mir bei den Datums funktionen der kopf raucht
        In kürze liegt die Würze, vorallendingen bei Spaghetti Code. Wie hausl schon sagt, Funktionen! Zerleg dein Problem in kleine Probleme...

        Ich hab dein Code beim überfliegen nicht komplett versand, aber das Grundproblem ist klar.

        Z.B. mit DateTime könnte das so ausschauen:
        PHP-Code:
        namespace foo;

        class 
        DateTime extends #DateTime {

            
        public function addDays($value) {
                
        $this->add(new DateInterval('PT'.($value*60*60*24).'S'));
            }

            public function 
        addWorkingdays($days) {
                while(
        $days) {
                    
        $this->addDays(1);

                    if(
        $this->isWorkingDay()) {
                        
        $days--;
                    }
                }
            }

            public function 
        isWorkingDay() {
                return !
        $this->isPublicHoliday() && !$this->isWeekend();
            }

            public function 
        isPublicHoliday() {
                
        //kümmer dich
            
        }

            public function 
        isWeekend() {
                return 
        $this->format('w')%== 0;
            }

            public function 
        getHour() {
                return 
        $this->format('G');
            }
        }

        $datum = new #foo#DateTime();
        if($datum->getHour() > 15$datum->addWorkingdays(1); //wenn nach 15 Uhr ein Tag extra
        $datum->addWorkingdays(5); 
        *edit* # ist Backslash

        Kommentar


        • #5
          Wenn du etwas mehr mit Daten arbeiten musst, schau dir mal das an: https://github.com/briannesbitt/Carb...hp#L1141-L1159

          In ähnlicher Weise wie die markierten Zeilen könntest du sicherlich auch Feiertage berechnen. Dafür einfach Carbon extenden und die entsprechende(n) Methode(n) hinzufügen. Am Anfang der Datei stehen die verfügbaren Eigenschaften.

          Kommentar


          • #6
            Zitat von hausl Beitrag anzeigen



            - Lagere den Code mehr in Funktionen aus.

            - Und besser nur mit der "neuen" DateTime-Klasse
            LG
            die antworten sind bis jetzt doch alle super das ist genau das was ich brauchte

            p.s. ja ein teil findet man bei google da ich das erste mal vor ich glaube zwei
            jahren am code gefummelt habe und da stand es um mein php verständniss noch schlechter

            Kommentar

            Lädt...
            X