Ich möchte hier mein Konzept für nationale und regionale Feiertage vorstellen und diskutieren.
Es gibt da für PHP schon eine Menge an Lösungen, z.B.
yasumi
Niirrty.Holiday
holiday-calendar
Eine weitere Klasse mach nur Sinn, wenn diese sich von den vorhandenen durch bestimmte Vorteile abhebt.
Die sind:
Ländercode-[[[Subnationaler-Code]-Subregion1]-Subregion2]
mit Trenner Minus - als Basis. Beispiele: DE, NL, DE-BY, DE-BY-SCH-A
Feiertage mit der Region-Kennung DE gelten für ganz Deutschland ohne Ausnahme und mit der Kennung DE-BY für Bayern. Die Vergabe der Kennungen obliegt den Ersteller der DB-Einträge.
Es wird jedoch empfohlen sich möglichst weit an die ISO 3361 anzulehnen. Die Kennung DE-BY-SCHW-A steht für Deutschland-Bayern-Schwaben-Augsburg(Stadt). Wird nun eine Feiertagsliste mit der Regionalkennung DE-BY-SCHW-A angefordert werden automatisch alle Regionen mit DE, DE-BY und DE-BY-SCHW mit einbezogen. Dieses Regionen-Konzept vereinacht auch die Administration der Datenbank. So ist Neujahr in vielen Ländern ein gesetzlicher Feiertag. Unter Region ist dann ein Eintrag wie z.B. DE,CH,AT,NL zu finden.
Für jeden Feiertag können nach belieben viele Spracheinträge vorhanden sein. Eine Unterscheidung nach Sprachgebieten/Dialekten kann auch erfolgen (de-DE, de-CH,..). So können unterschiedliche Namen für die gleichen Feiertage vergeben werden, z.B. für de-DE 'Christi Himmelfahrt' und für de-CH 'Auffahrt'.
Für Feiertage mit fixen Datum steht die Felder month und date zur Verfügung. Ausnahmen für bestimmte Jahre können durch Einträge in den Feldern year und notyear erreicht werden. Diese Einträge können auch als Komma getrennte Liste und Bereiche von - bis erfolgen.
Der Eintrag unter special der von einen Datums-Formel-Parser ausgewertet wird rundet die Sache ab. Spezielle Platzhalter wie {{easter}} in Verbindung mit der Interpretation von relativen Formaten und Verkettungen (Chain) bringen eine extrem hohe Flexibilität. Dies lässt sich wohl am Besten durch einige Beispiele für DB-Einträge demonstrieren:
.
.
In einigen Ländern gibt es Ausnahmen, die vom Wochentag und/oder anderen Feiertagen abhängen. Dafür eine allgeimgültige Vorschrift zu finden ist oft
mit einen erheblichen Zeitaufwand verbunden. Eine Liste für einen bestimmten Feiertag für mehrere Jahre findet sich dagegen schnell.
Um solche Listen in die Datenbank einpflegen zu können ist ein spezieller Selector-Platzhalter verfügbar.
{{YYYY:Ausdr1,Ausdr2,..}}
YYYY ist das Startjahr. Entsprechend dem aktuellen Jahr wird der Ausdruck gewählt und ersetzt. Beispiel:
{{2018:4/19,5/9,4/29,4/15,5/5,4/26,5/14,5/1,4/22,5/12,5/2}}
Für das Jahr 2019 wird dann "5/9" ausgewählt was in Verbindung mit dem Jahr dann "2019-05-09" als Datum liefert.
So, ich denke, alle bisherigen Anregungen aus Beiträgen im Forum berücksichtigt zu haben. Es ist jedoch nicht ausgeschlossen, das für bestimmte Regionen/Kalender Erweiterungen wünschenswert werden. Dies kann dann durch selbst gewählte Platzhalter {{myspecial}} in Verbindung mit einer gleichnamigen Methode in einer Erweiterungsklasse realisiert werden. Für die ersten Test's war jedoch bisher immer nur ein neuer Datenbankeintrag notwendig.
Hinweis:
Die Datenbank ist entgegen gängiger Praxis zu Gunsten einer einfachen Administration nicht normalisiert. Der Performanceverlust dürfte sich durch den für Datenbanken sehr kleinen Umfang an Datensätzen in Grenzen halten.
Freue mich wie immer auf Feedback sein es weitere Hinweise, Anregungen, Bedenken oder Kritik.
LG jspit
Es gibt da für PHP schon eine Menge an Lösungen, z.B.
yasumi
Niirrty.Holiday
holiday-calendar
Eine weitere Klasse mach nur Sinn, wenn diese sich von den vorhandenen durch bestimmte Vorteile abhebt.
Die sind:
- Die Definition eines Feiertages soll zu 99% mit einen Eintrag in die SQLite-Datenbank erfolgen. Um soche Einträge vorzunehmen sind mehrere kostenfreie Tools verfügbar, die eine bequeme Administration ermöglichen. Für viele Fälle ist ein Anfassen/Erweitern des PHP-Codes nicht notwendig.
- Das Regionen-Konzept ermöglicht die Definition von Feiertagen welche nur in bestimmten Gebieten gelten.
- Es können zeitliche Bedingungen für die Feiertagsdefinition vergeben werden, z.B. nur für ein bestimmtes Jahr oder ein Bereich.
- Es können Namen in allen Sprachen und auch unterschiedliche Namen je nach Land und Region vergeben werden.
- Ein leistungsfähiger Datums-Formel-Parser ermöglicht die Berechnung z.B.von beweglichen Feiertagen.
Ländercode-[[[Subnationaler-Code]-Subregion1]-Subregion2]
mit Trenner Minus - als Basis. Beispiele: DE, NL, DE-BY, DE-BY-SCH-A
Feiertage mit der Region-Kennung DE gelten für ganz Deutschland ohne Ausnahme und mit der Kennung DE-BY für Bayern. Die Vergabe der Kennungen obliegt den Ersteller der DB-Einträge.
Es wird jedoch empfohlen sich möglichst weit an die ISO 3361 anzulehnen. Die Kennung DE-BY-SCHW-A steht für Deutschland-Bayern-Schwaben-Augsburg(Stadt). Wird nun eine Feiertagsliste mit der Regionalkennung DE-BY-SCHW-A angefordert werden automatisch alle Regionen mit DE, DE-BY und DE-BY-SCHW mit einbezogen. Dieses Regionen-Konzept vereinacht auch die Administration der Datenbank. So ist Neujahr in vielen Ländern ein gesetzlicher Feiertag. Unter Region ist dann ein Eintrag wie z.B. DE,CH,AT,NL zu finden.
Für jeden Feiertag können nach belieben viele Spracheinträge vorhanden sein. Eine Unterscheidung nach Sprachgebieten/Dialekten kann auch erfolgen (de-DE, de-CH,..). So können unterschiedliche Namen für die gleichen Feiertage vergeben werden, z.B. für de-DE 'Christi Himmelfahrt' und für de-CH 'Auffahrt'.
Für Feiertage mit fixen Datum steht die Felder month und date zur Verfügung. Ausnahmen für bestimmte Jahre können durch Einträge in den Feldern year und notyear erreicht werden. Diese Einträge können auch als Komma getrennte Liste und Bereiche von - bis erfolgen.
Der Eintrag unter special der von einen Datums-Formel-Parser ausgewertet wird rundet die Sache ab. Spezielle Platzhalter wie {{easter}} in Verbindung mit der Interpretation von relativen Formaten und Verkettungen (Chain) bringen eine extrem hohe Flexibilität. Dies lässt sich wohl am Besten durch einige Beispiele für DB-Einträge demonstrieren:
.
comment | year | notyear | month | day | special | region |
Christi Himmelfahrt | {{easter}}|+39 Days | DE,CH,AT,NL | ||||
Reformationstag | 2017 | 10 | 31 | DE-BW,DE-BB,DE-MV,DE-SN,DE-ST,DE-TH | ||
Reformationstag 2017 | 2017 | 10 | 31 | DE | ||
Buß und Bettag | 11 | 23 | last Wed | DE-SN | ||
Genfer Bettag | first sunday of september {{year}}|next thursday | CH-GE |
In einigen Ländern gibt es Ausnahmen, die vom Wochentag und/oder anderen Feiertagen abhängen. Dafür eine allgeimgültige Vorschrift zu finden ist oft
mit einen erheblichen Zeitaufwand verbunden. Eine Liste für einen bestimmten Feiertag für mehrere Jahre findet sich dagegen schnell.
Um solche Listen in die Datenbank einpflegen zu können ist ein spezieller Selector-Platzhalter verfügbar.
{{YYYY:Ausdr1,Ausdr2,..}}
YYYY ist das Startjahr. Entsprechend dem aktuellen Jahr wird der Ausdruck gewählt und ersetzt. Beispiel:
{{2018:4/19,5/9,4/29,4/15,5/5,4/26,5/14,5/1,4/22,5/12,5/2}}
Für das Jahr 2019 wird dann "5/9" ausgewählt was in Verbindung mit dem Jahr dann "2019-05-09" als Datum liefert.
So, ich denke, alle bisherigen Anregungen aus Beiträgen im Forum berücksichtigt zu haben. Es ist jedoch nicht ausgeschlossen, das für bestimmte Regionen/Kalender Erweiterungen wünschenswert werden. Dies kann dann durch selbst gewählte Platzhalter {{myspecial}} in Verbindung mit einer gleichnamigen Methode in einer Erweiterungsklasse realisiert werden. Für die ersten Test's war jedoch bisher immer nur ein neuer Datenbankeintrag notwendig.
Hinweis:
Die Datenbank ist entgegen gängiger Praxis zu Gunsten einer einfachen Administration nicht normalisiert. Der Performanceverlust dürfte sich durch den für Datenbanken sehr kleinen Umfang an Datensätzen in Grenzen halten.
Freue mich wie immer auf Feedback sein es weitere Hinweise, Anregungen, Bedenken oder Kritik.
LG jspit
Kommentar