Ankündigung

Einklappen
Keine Ankündigung bisher.

Feiertage

Einklappen

Neue Werbung 2019

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

  • Feiertage

    ** [MOD: Abgetrennt vom hier zitierten Thread] **

    Zitat von jspit Beitrag anzeigen
    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.

    Das gefält mir gut.. Wäre eine nette Idee für die Wissensammlung für eine kleine Klasse die dann die Feiertage eines Jahres ausgeben kann, oder prüfen ob ein Tag ein Feiertag ist etc etc.. Mit Feiertags-Namen noch dazu, flexibel im Input für DE, AT, etc. etc..
    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

  • #2
    Zitat von hausl Beitrag anzeigen
    Das gefält mir gut.. Wäre eine nette Idee für die Wissensammlung für eine kleine Klasse die dann die Feiertage eines Jahres ausgeben kann, oder prüfen ob ein Tag ein Feiertag ist etc etc.. Mit Feiertags-Namen noch dazu, flexibel im Input für DE, AT, etc. etc..
    + 1

    Und ich wette ne Wurstsemmel das jspit schon ne Klasse in petto hat
    Ansonsten mach doch nen Wettbewerb auf, zur elegantesten Implementation
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Zitat von lstegelitz Beitrag anzeigen
      Und ich wette ne Wurstsemmel das jspit schon ne Klasse in petto hat
      Schliesse mich an jspit Falls nicht, hier auf die Schnelle meine 2ct als Kern (eher ein Samenkorn ) dazu .

      PHP-Code:
      $aHolidayList = [
          
      '01.01.' => 'Neujahr',
          
      '06.01.' => 'Hl. drei Könige',
          
      'E-1'    => 'Test -1',
          
      'E+0'    => 'Ostersonntag',
          
      'E+1'    => 'Ostermontag',
          
      '01.05.' => 'Staatsfeiertag',
          
      'E+39'   => 'Christi Himmelfahrt',
          
      'E+50'   => 'Pfingstmontag',
          
      'E+60'   => 'Fronleichnam',
          
      '15.08.' => 'Maria Himmelfahrt',
          
      '26.10.' => 'Nationalfeiertag',
          
      '01.11.' => 'Allerheiligen',
          
      '08.12.' => 'Maria Empfängnis',
          
      '24.12.' => 'Heilig Abend',
          
      '25.12.' => 'Christtag',
          
      '26.12.' => 'Stefanitag',
          
      '31.12.' => 'Silvester'
       
      ];

      date_default_timezone_set('Europe/Berlin');
      $dtEaster = new DateTime();
      $year $dtEaster->format('Y'); // aktuelles jahr
      $dtEaster $dtEaster->setTimestampeaster_date($year) ); // ostersonntag heuer 27.03.2016

      $format 'd.m.Y';

      foreach (
      $aHolidayList as $dateExpr => $desc) {
          if ( 
      strpos($dateExpr'E') === ) {
              
      $dateExpr ltrim($dateExpr'E');
              
      $dtCurr = clone $dtEaster;
              echo 
      $dtCurr->modify($dateExpr.' day')->format($format). " -- " $desc "<br>";
          } else {
              echo (new 
      DateTime($dateExpr.$year))->format($format). " -- " $desc "<br>";
          }

      Ausgabe:

      Code:
      01.01.2016 -- Neujahr
      06.01.2016 -- Hl. drei Könige
      26.03.2016 -- Test -1
      27.03.2016 -- Ostersonntag
      28.03.2016 -- Ostermontag
      01.05.2016 -- Staatsfeiertag
      05.05.2016 -- Christi Himmelfahrt
      16.05.2016 -- Pfingstmontag
      26.05.2016 -- Fronleichnam
      15.08.2016 -- Maria Himmelfahrt
      26.10.2016 -- Nationalfeiertag
      01.11.2016 -- Allerheiligen
      08.12.2016 -- Maria Empfängnis
      24.12.2016 -- Heilig Abend
      25.12.2016 -- Christtag
      26.12.2016 -- Stefanitag
      31.12.2016 -- Silvester
      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
        Hi,
        ihr vermutet schon richtig, das ist zum Teil bei mir schon in einer Klasse. Es existieren jedoch nur die Methoden isPublicHoliday() und setHolidayList(). Soweit wie hausl hab ich es noch nicht getrieben.
        Der Algorithmus ist ähnlich, ich greife jedoch auf weitere Methoden der Klasse zu. In der Liste fehlt noch der Karfreitag?
        Wenn noch länderspezifische Feiertage hinzukommen, da ist der Buß- und Bettag in D noch verbreitet. Der bildet eine Ausnahme und kann auch nicht mit den obigen Schema ohne Ergänzung erfasst werden.
        Ich hab dafür einfach ein "B" reserviert. Ich zeige hier dazu einfach mal einen Ausschnitt aus der Methode isPublicHoliday() :
        PHP-Code:

              
        if(stripos($day,"e") === 0) {
                
        //e+39=easterdate +39 Days
                
        $date self::create($easter)->modify(substr($day,1)." Days");
              }
              elseif(
        stripos($day,"b") === 0) { 
                
        //B = Buß- Bettag
                
        $date self::create("23.11.".$year)->modify("last Wed");
              }
              else { 

        Kommentar


        • #5
          Heilig Abend und Silvester sind keine gesetzlichen Feiertage */klugscheiß off*

          Grüße.

          Kommentar


          • #6
            In der Liste fehlt noch der Karfreitag?
            Nö, kein gesetzlicher in AT

            Ich stell mir sowas in der Art vor.. grad aus dem FF jetzt..

            PHP-Code:
            $holiday = new HolidayCalendar('DE');
            // DE per Config die Feiertage von DE laden

            $holiday->getAllHolidays($year);
            // return: Array mit allen Feiertagen und vollständigem Datum von $year

            $holiday->isHoliday("2016-03-27"); // oder mit DateTime
            // return: bool

            $holiday->getHolidayName("2016-03-27"// oder mit DateTime
            // return "Ostersonntag" 
            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


            • #7
              Man müsste das auch noch auf einzelne Bundesländer runter brechen

              Kommentar


              • #8
                Zitat von hausl Beitrag anzeigen

                PHP-Code:
                $holiday = new HolidayCalendar('DE'); 
                So einfach ist das leider nicht. Feiertage sind nicht nur in Staaten unterschiedlich sondern weichen auch in einzelnen Bundesländern ab.

                Grüße.

                Kommentar


                • #9
                  Man muss dazu sagen ich denk nur laut.

                  PHP-Code:
                  $holiday = new HolidayCalendar('DE-Bayern');

                  // ev. macht ja auch mehr Sinn...
                  $holiday = new HolidayCalendar('AT''DE-Bayern');

                  // etc.. 
                  Der Arme Hund ist eh der der die Config-Files bauen muss bzw. dann die Frage wie man es differneziert darstellt.

                  Oder man bekommt dann halt als Array zurück

                  Code:
                  [AT][...]
                  [DE-Bayern][...]
                  Wäre insofern praktisch weil dann kann ich damit auch statt Feiertage was weiß ich alle Termine meine Fussballmanschaft in die Cofig legen und dann hab ich einen Fussbalkalender oder was auch immer.. Jahrestage vom Putzihasimausi

                  Die sehen nur so aus Config - zB " /config/AT.php"

                  PHP-Code:
                  $aHolidayList = [
                      
                  '01.01.' => 'Neujahr',
                      
                  '06.01.' => 'Hl. drei Könige',
                      
                  'E+0'    => 'Ostersonntag',
                      
                  'E+1'    => 'Ostermontag',
                      
                  '01.05.' => 'Staatsfeiertag',
                      
                  'E+39'   => 'Christi Himmelfahrt',
                      
                  'E+50'   => 'Pfingstmontag',
                      
                  'E+60'   => 'Fronleichnam',
                      
                  '15.08.' => 'Maria Himmelfahrt',
                      
                  '26.10.' => 'Nationalfeiertag',
                      
                  '01.11.' => 'Allerheiligen',
                      
                  '08.12.' => 'Maria Empfängnis',
                      
                  '24.12.' => 'Heilig Abend',
                      
                  '25.12.' => 'Christtag',
                      
                  '26.12.' => 'Stefanitag',
                      
                  '31.12.' => 'Silvester'
                   
                  ]; 
                  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


                  • #10
                    Also ich hab mir das mal angesehen, ganz so schlimm scheint es nicht zu sein.

                    Anmk: Es geht hier nur um die gesetzlichen Feiertage!
                    Basis diese Seite: http://www.feiertage-deutschland.de/2016/ bzw. // http://www.feiertage-oesterreich.at/2016/

                    1. AT ist da einfach.. alle nationalen gesetzichen Feiertage gelten in allen Bundesländern.

                    2. Bei DE differiert es regional (je Bundesland) um einiges.

                    Daher mal auf DE konzentiert.


                    In Summe schaut es so aus:

                    Nationale Feiertage - für alle Bundesländer:
                    Code:
                        NATIONAL (9):
                    
                        01.01.  Neujahr
                        E-2     Karfreitag
                        E+1     Ostermonatg
                        01.05.  Tag der Arbeit
                        E+39    Christi Himmelfahrt
                        E+50    Pfingsmontag
                        03.10.  Tag der Deutschen Einheit
                        25.12.  1. Weihnachtstag
                        26.12.  2. Weihnachtstag

                    Regionale - abweichend in den Bundesländern:
                    Code:
                        REGIONAL:
                    
                        06.01.  Heilige Drei Könige     BW BY ST
                        E+60    Fronleichnahm           BW BY HE NW RP SL SN TH
                        15.08.  Mariä Himmelfahrt       BY SL
                        31.10.  Reformationstag         BW BB MV SN ST TH
                        01.11.  Allerheiligen           BW BY NW RP SL
                        16.11.  Buß- und Bettag         BY SN

                    Ich habe es jetzt mal grundsätzlich so weit, das ich mir per gewünschtes Jahr ein Array erstellen kann und grunsätzlich einschränken kann ob ich mit, ohne und welchem/welchen Bundesland/länder es sein soll. Rest folgt.
                    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


                    • tr0y
                      tr0y kommentierte
                      Kommentar bearbeiten
                      Die Regionalen Tanzverbote sind noch blöder ( falls jemand sich mal irgendwann mit einer Event-Webseite beschäftigt ).

                  • #11
                    Wenn man nur eine Liste der Feiertage haben möchte, wäre es nicht sinnvoll sich eine iCal-Datei z.B. von http://www.ifeiertage.de/ zu besorgen und diese zu parsen?

                    Kommentar


                    • #12
                      Ja sicher auch ein Möglichkeit mit allesn Vor- und Nachteilen.
                      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


                      • #13
                        Macht es auch Sinn auf "nur Regionale" als Ausgabe defnieren zu können? Denke eher nicht, die nationalen sind doch die einzigen "Konstanten" in dem ganzen "gewirr". Bisher hab ich das nicht.

                        Bisher geht mal das (kommt schon von der Klasse):

                        PHP-Code:
                        date_default_timezone_set('Europe/Berlin');
                        $holiday = new HolidayCalendar('DE'); 
                        PHP-Code:
                        // alles von 2016
                        $a $holiday->createNormalizedDatesArray(2016);
                        print_r($a);
                        /*
                        Array
                        (
                            [2016-01-01] => Neujahr
                            [2016-01-06] => Heilige Drei Könige
                            [2016-03-25] => Karfreitag
                            [2016-03-28] => Ostermontag
                            [2016-05-01] => Tag der Arbeit
                            [2016-05-05] => Christi Himmelfahrt
                            [2016-05-16] => Pfingsmontag
                            [2016-05-26] => Fronleichnahm
                            [2016-08-15] => Mariä Himmelfahrt
                            [2016-10-03] => Tag der Deutschen Einheit
                            [2016-10-31] => Reformationstag
                            [2016-11-01] => Allerheiligen
                            [2016-11-16] => Buß- und Bettag
                            [2016-12-25] => 1. Weihnachtstag
                            [2016-12-26] => 2. Weihnachtstag
                        )
                        */ 
                        PHP-Code:
                        // alles von 2013
                        $a $holiday->createNormalizedDatesArray(2013);
                        print_r($a);
                        /*
                        Array
                        (
                            [2013-01-01] => Neujahr
                            [2013-01-06] => Heilige Drei Könige
                            [2013-03-29] => Karfreitag
                            [2013-04-01] => Ostermontag
                            [2013-05-01] => Tag der Arbeit
                            [2013-05-09] => Christi Himmelfahrt
                            [2013-05-20] => Pfingsmontag
                            [2013-05-30] => Fronleichnahm
                            [2013-08-15] => Mariä Himmelfahrt
                            [2013-10-03] => Tag der Deutschen Einheit
                            [2013-10-31] => Reformationstag
                            [2013-11-01] => Allerheiligen
                            [2013-11-16] => Buß- und Bettag
                            [2013-12-25] => 1. Weihnachtstag
                            [2013-12-26] => 2. Weihnachtstag
                        )
                        */ 
                        PHP-Code:
                        // nur nationale von 2013
                        $a $holiday->createNormalizedDatesArray(2013false);
                        print_r($a);
                        /*Array
                        (
                            [2013-01-01] => Neujahr
                            [2013-03-29] => Karfreitag
                            [2013-04-01] => Ostermontag
                            [2013-05-01] => Tag der Arbeit
                            [2013-05-09] => Christi Himmelfahrt
                            [2013-05-20] => Pfingsmontag
                            [2013-10-03] => Tag der Deutschen Einheit
                            [2013-12-25] => 1. Weihnachtstag
                            [2013-12-26] => 2. Weihnachtstag
                        )*/ 
                        PHP-Code:
                        // nationale und MV von 2013
                        $a $holiday->createNormalizedDatesArray(2013, ['MV']);
                        print_r($a);
                        /*
                        Array
                        (
                            [2013-01-01] => Neujahr
                            [2013-03-29] => Karfreitag
                            [2013-04-01] => Ostermontag
                            [2013-05-01] => Tag der Arbeit
                            [2013-05-09] => Christi Himmelfahrt
                            [2013-05-20] => Pfingsmontag
                            [2013-10-03] => Tag der Deutschen Einheit
                            [2013-10-31] => Reformationstag
                            [2013-12-25] => 1. Weihnachtstag
                            [2013-12-26] => 2. Weihnachtstag
                        )
                        */ 

                        Das dem zu Grund liegende Config-File für "DE" sieht aktuell so aus:

                        PHP-Code:
                        <?php

                        /**

                        http://www.feiertage-deutschland.de/2016/

                            NATIONAL (9):

                            01.01.  Neujahr
                            E-2     Karfreitag
                            E+1     Ostermonatg
                            01.05.  Tag der Arbeit
                            E+39    Christi Himmelfahrt
                            E+50    Pfingsmontag
                            03.10.  Tag der Deutschen Einheit
                            25.12.  1. Weihnachtstag
                            26.12.  2. Weihnachtstag


                            REGIONAL:

                            06.01.  Heilige Drei Könige     BW BY ST
                            E+60    Fronleichnahm           BW BY HE NW RP SL SN TH
                            15.08.  Mariä Himmelfahrt       BY SL
                            31.10.  Reformationstag         BW BB MV SN ST TH
                            01.11.  Allerheiligen           BW BY NW RP SL
                            16.11.  Buß- und Bettag         BY SN


                        $aRegions = [
                            'BW' => 'Baden-Württemberg',
                            'BY' => 'Bayern',
                            'BE' => 'Berlin',
                            'BB' => 'Brandenburg',
                            'HB' => 'Freie Hansestadt Bremen',
                            'HH' => 'Hamburg',
                            'HE' => 'Hessen',
                            'MV' => 'Mecklenburg-Vorpommern',
                            'NI' => 'Niedersachsen',
                            'NW' => 'Nordrhein-Westfalen',
                            'RP' => 'Rheinland-Pfalz',
                            'SL' => 'Saarland',
                            'SN' => 'Sachsen',
                            'ST' => 'Sachsen-Anhalt',
                            'SH' => 'Schleswig-Holstein',
                            'TH' => 'Thüringen'
                        ];
                        */

                        $aNational = [

                            
                        '01.01.' => [
                                
                        'name' => 'Neujahr'
                            
                        ],

                            
                        'E-2' => [
                                
                        'name' => 'Karfreitag'
                            
                        ],

                            
                        'E+1' => [
                                
                        'name' => 'Ostermontag'
                            
                        ],

                            
                        '01.05.' => [
                                
                        'name' => 'Tag der Arbeit'
                            
                        ],

                            
                        'E+39' => [
                                
                        'name' => 'Christi Himmelfahrt'
                            
                        ],

                            
                        'E+50' => [
                                
                        'name' => 'Pfingsmontag'
                            
                        ],

                            
                        '03.10.' => [
                                
                        'name' => 'Tag der Deutschen Einheit'
                            
                        ],

                            
                        '25.12.' => [
                                
                        'name' => '1. Weihnachtstag'
                            
                        ],

                            
                        '26.12.' => [
                                
                        'name' => '2. Weihnachtstag'
                            
                        ]

                        ];



                        $aRegional = [

                            
                        '06.01.' => [
                                
                        'name'    => 'Heilige Drei Könige',
                                
                        'regions' => ['BW''BY''ST']
                            ],

                            
                        'E+60' => [
                                
                        'name'    => 'Fronleichnahm',
                                
                        'regions' => ['BW''BY''HE''NW''RP''SL''SN''TH']
                            ],

                            
                        '15.08.' => [
                                
                        'name'    => 'Mariä Himmelfahrt',
                                
                        'regions' => ['BY''SL']
                            ],

                            
                        '31.10.' => [
                                
                        'name'    => 'Reformationstag',
                                
                        'regions' => ['BW''BB''MV''SN''ST''TH']
                            ],

                            
                        '01.11.' => [
                                
                        'name'    => 'Allerheiligen',
                                
                        'regions' => ['BW''BY''NW''RP''SL']
                            ],

                            
                        '16.11.' => [
                                
                        'name'    => 'Buß- und Bettag',
                                
                        'regions' => ['BY''SN']
                            ]

                        ];


                        return [
                        $aNational$aRegional];
                        Werd dann am Wochenende damit weitermachen.
                        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


                        • #14
                          Ich sehe bei der Verwendung der iCal-Datei fast nur Nachteile:
                          • fixe Daten über ein Zeitraum von nur 3 Jahren
                          • Abhängigkeit von einem externen Service
                          • relativ hoher Aufwand fürs parsen der iCal Datei
                          • Pflegeaufwand insgesamt hoch
                          Der Pflegeaufwand für den obigen Vorschlag beschränkt sich auf Anpassungen infolge von Gesetzesänderungen. Auch möglich und denkbar, Feiertagsinformationen für länger zurückliegende Zeiten oder die nahe Zukunft ermitteln zu müssen.

                          hausl : Hab ja die Feiertage nur ansatzweise in meiner Klasse, da selbst noch nicht benötigt.
                          Primäres Ziel für mich ist es, für ein bestimmtes Datum ermitteln zu können, ob dies ein üblicher Feiertag ist.
                          Mit der Möglichkeit neben der fest in der Klasse verankerten Liste eine alternative Basis-Liste zu laden und
                          dort beliebige Listen sozusagen als Erweiterung hinzufügen zu können, so glaube ich, damit komme ich erstmal hin.

                          Hab dafür mal den Test etwas aktualisiert, die Feiertagsbeispiele sind am Ende zu finden.

                          Überblicke noch nicht, welches Ziel du anstrebst.

                          Kommentar


                          • #15
                            hausl Die Daten sind so noch lange nicht brauchbar.

                            Zuerstmal finde ich das Deine Datenstruktur viel zu einfach ist und die wahre komplexität des Themas abzubilden.

                            Ich würde nicht mit solchen Verallgemeinerungen anfangen wie die unterschiedlichen staatlichen Bezeichner der Feiertage außer acht zu lassen.

                            Ferner gibts es auch Feiertage die nur in bestimmten Orten oder Ortsteilen gelten. Die sollten genauso mit beachtet werden.

                            Und das ist jetzt alles nur auf Deutschland bezogen.

                            Und außerdem finde ich, das wenn jemand so eine Lib schreiben will dann sollte er/sie zumindest die Möglichkeit nicht außer Acht lassen, das nicht in allen Ländern/Religion/Ethnien Feiertag anhand Ostern berechnet werden.

                            Da gehört schon weitaus VIELLLL mehr dazu als bisher hier gesagt wurde. Aber nur eine für Deutschland zu schreiben oder wenns hochkommt für nen paar Nachbarländer halte ich nicht für erstrebenswert.

                            Gruß, Ulf
                            PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

                            Kommentar

                            Lädt...
                            X