Ankündigung

Einklappen
Keine Ankündigung bisher.

Feiertage ermitteln

Einklappen

Neue Werbung 2019

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

  • Feiertage ermitteln


    MOD: Auf Grund des Threadverlaufes den Titel geändert. (Alt: "Anzahl der Tage berechnen mit 86400 Sekunden ergibt Dezimalzahl")


    PHP-Code:
    $start mktime(0,0,0,3,23,2016);
    $end mktime(0,0,0,3,30,2016);

    $nceil((($end $start)/86400)); // Ergebnis: 7

    $start ceil($start/86400)*86400-ceil(date('Z'$start));
    $end ceil($end/86400)*86400-ceil(date('Z'$end));

    echo 
    number_format((($end $start)/86400), 2','' '); //Ergebnis: 6,96 

    Damit eine nachfolgende Rechnung funktioniert, müssen die Ergebnisse identisch sein (also 7).

    Wo liegt der Fehler?

  • #2
    Nicht jeder Tag hat 86400 Sekunden. Also spar dir einfach die Herumrechnerei mit Sekunden.

    PHP-Code:
    $timeZone = new DateTimeZone('Europe/Berlin');

    $date1 = new DateTime('2016-03-23'$timeZone);
    $date2 = new DateTime('2016-03-30'$timeZone);

    $diff $date1->diff($date2);

    echo 
    $diff->days// 7 

    Kommentar


    • #3
      Schau auch mal hier.. Grundlagenbeispiele (u.a. auch Differenzen, etc.. ) zum Umgang mit Datum in PHP. http://php-de.github.io/jumpto/datetime/
      The string "()()" is not palindrom but the String "())(" is.

      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
        Hatte vergessen, dass wir noch Schaltjahre haben.

        Kommentar


        • #5
          PHP-Code:
          if (date('Y'$start)==date('Y'$end)) {

          for( 
          $i=0$i<=$n$i++ ) {
          if( 
          in_array(($i+$w)%7, array(0,6)) ) {
          continue;
          }

          foreach( 
          $feiertage as $feiertag ) {
          if( 
          $feiertag == ($start+($i*86400)) ) {
          $anzahl++;
          $feiertag_anzeige$feiertag_anzeige$tag[date('w'$feiertag)]. date('d.m.Y'$feiertag). " | ";
          $kw_feiertag[] = date('W'$feiertag);
          }
          }
          }

          Das Problem ist, dass die nachfolgende Rechnung zum Abgleich von Feiertagen auf Sekundenbasis erfolgt in einer FOR-Schleife.

          Die von hellbringer gezeigte Lösung bringt mir doch im Endeffekt nur die Lösung wie bei mir bereits mit

          PHP-Code:
          $nceil((($end $start)/86400)); 

          Kommentar


          • hausl
            hausl kommentierte
            Kommentar bearbeiten
            MOD: Bitte PHP-Codetags nutzen. Danke!

        • #6
          Bitte benütze in Zukunft Code tags,
          bitte deffiniere alle benützen Variablen

          Kommentar


          • #7
            Zitat von alexxx-87 Beitrag anzeigen
            Das Problem ist, dass die nachfolgende Rechnung zum Abgleich von Feiertagen auf Sekundenbasis erfolgt in einer FOR-Schleife.

            Die von hellbringer gezeigte Lösung bringt mir doch im Endeffekt nur die Lösung wie bei mir bereits mit

            PHP-Code:
            $nceil((($end $start)/86400)); 
            Hand hoch, wer das verstanden hat. Was willst du eigentlich genau. Oben ging es um eine Differenz, das wurde dir gezeigt und jetzt?
            The string "()()" is not palindrom but the String "())(" is.

            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


            • #8
              PHP-Code:
              <?php

              $start 
              mktime(0,0,0,3,23,2016);
              $end mktime(0,0,0,3,30,2016);

              $nceil((($end $start)/86400));
              $w = (int)date('w'$start);
              $YY date('Y'$start);

              $start ceil($start/86400)*86400-ceil(date('Z'$start));
              $end ceil($end/86400)*86400-ceil(date('Z'$end));

              $feiertage = array(
              mktime(0,0,0,1,1,$YY), //Neujahr
              mktime(0,0,0,1,6,$YY), //Heilige Drei Könige
              strtotime("-2 day",easter_date($YY)), //Karfreitag
              strtotime("+1 day",easter_date($YY)), //Ostermontag
              mktime(0,0,0,5,1,$YY), // Tag der Arbeit
              strtotime("+39 day",easter_date($YY)), //Christi Himmelfahrt
              strtotime("+50 day",easter_date($YY)), //Pfingstmontag
              strtotime("+60 day",easter_date($YY)), //Fronleichnam
              mktime(0,0,0,10,3,$YY), //Tag der Deutschen Einheit
              mktime(0,0,0,11,1,$YY), //Allerheiligen
              mktime(0,0,0,12,25,$YY), //Weihnachtstag 1
              mktime(0,0,0,12,26,$YY), //Weihnachtstag 2
              );

              if (
              date('Y'$start)==date('Y'$end)) {

              for( 
              $i=0$i<=$n$i++ ) {
              if( 
              in_array(($i+$w)%7, array(0,6)) ) {
              continue;
              }

              foreach( 
              $feiertage as $feiertag ) {
              if( 
              $feiertag == ($start+($i*86400)) ) {
              $anzahl++;
              $feiertag_anzeige$feiertag_anzeige$tag[date('w'$feiertag)]. date('d.m.Y'$feiertag). " | ";
              $kw_feiertag[] = date('W'$feiertag);
              }
              }
              }
              }

              echo 
              $feiertag_anzeige;

              ?>
              Im Ergebnis fehlt wegen der nicht übereinstimmenden Sekundenzahl der Ostermontag als Feiertag.

              Jetzt auch mit Code-Tags Danke für den Hinweis!

              Kommentar


              • #9
                Warum rechnest du in Sekunden herum? Lass das doch!

                Kommentar


                • #10
                  alexxx-87 ganz sicher bin ich mir immer noch nicht.. Du willst eigentlich einfach nur die Feiertage eines Jahres bekommen?

                  Ich denke da gibt es schon einiges fertiges im Web, du bist sicher nicht der Erste der sowas braucht.
                  The string "()()" is not palindrom but the String "())(" is.

                  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


                  • #11
                    PHP-Code:
                    if( $feiertag == (strtotime("+$i day",$start)) ) {
                    $anzahl++;
                    $feiertag_anzeige$feiertag_anzeige$tag[date('w'$feiertag)]. date('d.m.Y'$feiertag). " | ";
                    $kw_feiertag[] = date('W'$feiertag);

                    hausl und hellbringer : Eure Anregung ohne Sekunden habe ich in obigen Code umgesetzt! Jetzt wird auch der 28.03.2016 als Feiertag berücksichtigt. Manchmal ist die Lösung doch so nah

                    Kommentar


                    • #12
                      Von Bundeseinheitlichen Feiertagen gibt es 2 Typen: die fixen und die von Ostern abhängen.
                      Die Feiertage hab ich in einem bestimmten Format als Array gespeichert. Beispiel:

                      PHP-Code:
                      //dd.mm every year, E-2 Easter - 2 Days, dd.mm.yyyy fix Date
                       
                      $holidayList '1.1,E-2,E+0,E+1,1.5,E+39,E+49,E+50,3.10,24.12,25.12,26.12,31.12'
                      Damit kann ich alle Feiertage vereinbaren. Der Code, welcher ermittelt ob ein Feiertag vorliegt oder nicht, kann dabei fix bleiben.

                      Und ja, die Sommerzeitumstellung fällt dieses Jahr auf Ostern. Der 27.3.2015 hat deshalb nur 82800 Sekunden.

                      Kommentar


                      • #13
                        Ich hab den weiteren Verlauf mal abgetrennt .. hier gehts weiter: http://www.php.de/forum/webentwicklu...0286-feiertage
                        The string "()()" is not palindrom but the String "())(" is.

                        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

                        Lädt...
                        X