Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP-Klasse für nationale/regionale Feiertage mit SQLite-DB als Konfiguration

Einklappen

Neue Werbung 2019

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

  • #31
    Zitat von Ulfikado Beitrag anzeigen
    Hab am WE meine Feuture für nicht arbeitsfreie Feiertage fertig gestellt und angefangen einen Loader zu bauen um mit unterschiedlichen Quellen und Formaten klar kommt. Da hab ich genug zu tun
    Bleibt spannend wie solch ein Loader für dein Projekt umgesetzt wird.
    Bei mir stehen ja die Regeln/Formeln für ein Feiertagsdatum in der Konfiguration(Datenbank). Habe bisher keine Quelle_ gefunden, welche solche Regeln/Formeln liefert. Alle von mir zum Thema gefundenen Quellen liefern ein fertiges Datum zum vorgegebenen Jahr.

    Habe mich jetzt doch entschlossen, weitere Länder als Vorlage in die Konfiguration einzupflegen. Aktuell sind ca. 20 Länder verfügbar. Ziel ist es, die Eurozone abzudecken.
    Für diese Tätigkeit wurden mehrere externe Quellen als Vergleich herangezogen. Ich musste dabei feststellen, das zu einen kleinen Teil unterschiedliche Resultate geliefert werden. Extrem dünn sind Daten für das Jahr 2019 hinaus verfügbar.

    Arbeite zur Zeit an einen Test, welcher Feiertagsdaten aus einer externen Quelle_ liefert und diese als Vergleichsdaten für die Klasse zur Verfügung stellt. Das Vervollständigen der Datenbankeinträge erfolgt damit gewissermaßen testgetrieben. Als Resultat erhalte ich eine Tabelle ähnlich

    phpcheck.JspitHolidayOffice.php Total: 78 Tests, 51 Errors
    PHPCheck V1.3.20, OS: WINNT, PHP-Version: 5.3.8 (32 Bit), Time: 1.29 s, Memory: 1.8M (128M)
    2017-01-01 Switzerland New Years Day 59 $result = $holiday->holidayName($icsEvent->date,$lang);
    $t->check($result, $result !== false AND $result != "?");
    [0.4 ms]
    'New Year\'s Day'
    Ok
    2017-01-02 Switzerland Berchtolds Day (Regional) 59 $result = $holiday->holidayName($icsEvent->date,$lang);
    $t->check($result, $result !== false AND $result != "?");
    [1.8 ms]
    'Berchtolds Day'
    Ok
    2017-01-06 Switzerland Epiphany (Regional) 59 $result = $holiday->holidayName($icsEvent->date,$lang);
    $t->check($result, $result !== false AND $result != "?");
    [0.7 ms]
    'Epiphany'
    Ok
    2017-03-01 Switzerland Republic Day (Regional) 59 $result = $holiday->holidayName($icsEvent->date,$lang);
    $t->check($result, $result !== false AND $result != "?");
    [1.6 ms]
    false
    Error
    2017-03-19 Switzerland St Josephs Day (Regional) 59 $result = $holiday->holidayName($icsEvent->date,$lang);
    $t->check($result, $result !== false AND $result != "?");
    [1.7 ms]
    'St. Joseph\'s'
    Ok
    2017-04-07 Switzerland Näfelser Fahrt (Regional) 59 $result = $holiday->holidayName($icsEvent->date,$lang);
    $t->check($result, $result !== false AND $result != "?");
    [1.6 ms]
    false
    Error
    Mit jeden manuellen Datenbankeintrag werden die noch vorhandenen Fehler im Test Schritt für Schritt abgebaut. Gleichzeitig gibt so ein Test in den Folgejahren Hinweise wo Korrekturen notwendig werden.

    Edit 12.Juni 2018:
    Das Beispiel für eine Konfigurations-Datenbank JspitHoliday.sqlite (hier) unterstützt jetzt folgende Länder:

    "DE":Germany, "AT":Austria, "NL":Netherlands, "DK": Denmark, "FR":France, "IT":Italy(*), "ES":Spain(*), "LU":Luxembourg, "BE":Belgium(*), "GR":Greece, "SK":Slovakia, "IE":Ireland, "CY":Cyprus, "PT":Portugal, "EE":Estonia, "FI":Finland, "LV":Latvia, "LT":Lithuania, "MT":Malta "CZ":Czech Republic, "PL":Poland, "CH":Switzerland, "GB":Great Britain(*), "US":United States(*), "JP":Japan

    (*) without regional holidays

    Die Feiertagsnamen sind alle in Englisch verfügbar, für DE,AT und CH auch in Deutsch.

    Kommentar


    • #32
      Der im letzten Beitrag beschriebene Test inklusive kompletter Umgebung ist jetzt auf github ( https://github.com/jspit-de/holiday ) verfügbar.
      Die Benutzung ist denkbar einfach:
      • Download als zip
      • Auspacken und in ein passendes Webserververzeichnis kopieren
      • phpcheck.JspitHolidayOffice.php im Browser aufrufen
      Für Änderungen und Erweiterungen der SQLite-Datenbank hat sich das Tool DB-Browser für SQLite bestens bewährt.
      Um Zeit beim Test zu sparen kann die lange Länderliste in phpcheck.JspitHolidayOffice.php auskommentiert und durch ein Eintrag des neuen Landes ersetzt werden.
      Ich habe den Test immer nach jeden neuen Datenbankeintrag aufgerufen um Schreibfehler gleich korrigieren zu können.
      Das kann aber jeder handhaben wie er möchte.

      LG jspit

      Kommentar


      • #33
        Zitat von jspit Beitrag anzeigen
        Die Benutzung ist denkbar einfach:
        • Download als zip
        • Auspacken und in ein passendes Webserververzeichnis kopieren
        • phpcheck.JspitHolidayOffice.php im Browser aufrufen
        Bei mir passiert dann das hier:
        Code:
        Total: 0 Tests, 0 Errors
        PHPCheck V1.3.20, OS: Linux, PHP-Version: 7.1.14 (64 Bit), Time: 0.15 s, Memory: 2.0M (16M) 
        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


        • #34
          Vermute es kann die API für die Vergleichswerte nicht angesprochen werden. Möglich es fehlt die HTTPS Unterstützung, z.B. wenn openssl extension nicht aktiviert ist. Werde mal sehen, ob ich da noch eine Meldung einbauen kann.
          Die kurze Zeit 0.15 s deutet auf sowas hin.

          Kommen sollte so etwas.

          phpcheck.JspitHolidayOffice.php Total: 1091 Tests, 4 Errors
          PHPCheck V1.3.20, OS: Linux, PHP-Version: 7.1.16 (64 Bit), Time: 10.33 s, Memory: 4.0M (128M)
          2017-01-01 Germany New Years Day 68 $result = $holiday->holidayName($icsEvent->date,$lang);
          $t->check($result, $result !== false AND $result != "?");
          [0.5 ms]
          'New Year\'s Day'
          Ok
          Danke für deine Mühe.

          Edit: Hab in die Helferklasse icsEventReader eine Prüfung eingebaut. Wenn kein oder falscher Content geliefert wird werden Exceptions geworfen.
          Edit(2): Die "openssl extension" muss verfügbar sein und "allow_url_fopen" muß auf on stehen damit der Test läuft. Es wird eine RuntimeException geworfen wenn dies nicht gegeben ist.

          Kommentar


          • #35
            Neues:
            • Mit der Version 1.3 von JspitHoliday können jetzt Definitionen für Feiertage auf der Basis anderer Kalender eingepflegt werden. So generieren die Einträge Tag=1, Monat=1 und Special = "{{chinese}}" z.B. das Datum für das chinesische Neujahrsfest Chunjie, dessen Termin nach dem traditionellen chinesischen Lunisolarkalender berechnet wird. Für 2019 fällt dieser Feiertag auf den 5. Februar.
            • Die Musterkonfiguration umfasst jetzt 32 Länder, darunter alle EU-Staaten.
            Mehr dazu auf Github.

            Kommentar


            • #36
              Neues:

              Die Klasse wurde mit V1.31 um eine Methode ergänzt, die ein Array von Daten (Datumswerte Y-m-d) von Feiertagen liefert, die zwischen einen Start-Datum und einen End-Datum liegen. Mit einem optionalen 3.Parameter als Filter können die Wochentage angegeben werden die berücksichtigt werden sollen. So liefert
              PHP-Code:
                $dateArray $holiday->dateList("2019-03-01","2019-03-31",array(1,2,3,4,5)); 
              ein Array von Feiertagen im März 2019 welche auf einen Montag bis Freitag fallen (also ausgenommen die Wochenden).

              So können auch leicht Feiertage ermittelt werden die auf ein Wochenende fallen. Beispiel für Deutschland Region Berlin 2020:

              PHP-Code:
              $holiday JspitHoliday::create('de-BE');
              $dateArray $holiday->dateList("2020-01-01","2020-12-31",array(0,6));
              foreach(
              $dateArray as $date){
                echo 
              $date." ".$holiday->holidayName($date,"de")."<br>";

              Resultat:
              2020-03-08 Internationaler Frauentag
              2020-04-12 Ostern
              2020-05-31 Pfingsten
              2020-10-03 Tag der Deutschen Einheit
              2020-12-26 2. Weihnachtstag

              Also alles im Lot. 2020 wird wieder ein arbeitgeberfreundliches Jahr.

              LG jspit

              Kommentar

              Lädt...
              X