-
-
Save tvlooy/1894247 to your computer and use it in GitHub Desktop.
<?php | |
// (c) Tom Van Looy <[email protected]> https://ctors.net/isc_license.txt | |
// Alle feestdagen kunnen berekend worden, de berekende zijn allemaal | |
// afhankelijk van pasen. PHP heeft een functie easter_date(). | |
// Makkie dus. Hoe easter_date() zelf werkt kan je hier raadplegen: | |
// https://github.com/php/php-src/blob/master/ext/calendar/easter.c | |
// Geen parameter? Doen we gewoon dit jaar toch. | |
$jaar = date('Y'); | |
if ($argc > 1) { | |
$jaar = (int) $argv[1]; | |
} | |
// beperking van easter_date() | |
if ($jaar < 1970 || $jaar > 2037) { | |
$jaar = date('Y'); | |
} | |
ini_set('date.timezone', 'Europe/Brussels'); | |
$formatter = new \IntlDateFormatter('nl_BE', null, null); | |
$formatter->setPattern('E dd LLL Y'); | |
$format = function(\DateTime $datum, $omschrijving) use ($formatter) { | |
$formattedDatum = $formatter->format($datum); | |
if (\strlen($formattedDatum) === 14) { | |
$formattedDatum = \substr($formattedDatum, 0, 10) . ' ' . \substr($formattedDatum, -4); | |
} | |
return "$formattedDatum : $omschrijving\n"; | |
}; | |
/* ***** Voor Belgie ******************************************************** */ | |
// vaste dagen | |
$nieuwjaar = new \DateTime("$jaar-01-01"); | |
$feestVdArbeid = new \DateTime("$jaar-05-01"); | |
$nationaal = new \DateTime("$jaar-07-21"); | |
$olvHemelvaart = new \DateTime("$jaar-08-15"); | |
$allerheiligen = new \DateTime("$jaar-11-01"); | |
$wapenstilstand = new \DateTime("$jaar-11-11"); | |
$kerstmis = new \DateTime("$jaar-12-25"); | |
// berekend | |
$pasen = new \DateTime(); | |
$pasen->setTimestamp(\easter_date($jaar)); // bedankt PHP | |
$paasMaandag = clone $pasen; | |
$paasMaandag->add(new \DateInterVal('P1D')); // 1 dag na pasen | |
$olhHemelvaart = clone $pasen; | |
$olhHemelvaart->add(new \DateInterVal('P39D')); // 39 dagen na pasen | |
$pinksteren = clone $olhHemelvaart; | |
$pinksteren->add(new \DateInterVal('P10D')); // 10 dagen na OLH hemelvaart | |
$pinksterMaandag = clone $pinksteren; | |
$pinksterMaandag->add(new \DateInterVal('P1D')); // 1 dag na pinksteren | |
echo "\nFeestdagen Belgie $jaar\n-----------------------\n\n" . | |
$format($nieuwjaar, 'Nieuwjaar') . | |
$format($pasen, 'Pasen') . | |
$format($paasMaandag, 'Paasmaandag') . | |
$format($feestVdArbeid, 'Feest van de arbeid') . | |
$format($olhHemelvaart, 'O.L.H. Hemelvaart') . | |
$format($pinksteren, 'Pinksteren') . | |
$format($pinksterMaandag, 'Pinkstermaandag') . | |
$format($nationaal, 'Nationale feestdag') . | |
$format($olvHemelvaart, 'O.L.V. Hemelvaart') . | |
$format($allerheiligen, 'Allerheiligen') . | |
$format($wapenstilstand, 'Wapenstilstand') . | |
$format($kerstmis, 'Kerstmis') . | |
"\n"; | |
/* ***** Voor Nederland ***************************************************** */ | |
// vaste dagen | |
$nieuwjaar = new \DateTime("$jaar-01-01"); | |
$bevrijdingsdag = new \DateTime("$jaar-05-05"); | |
$kerstmis = new \DateTime("$jaar-12-25"); | |
$tweedekerstdag = new \DateTime("$jaar-12-26"); | |
$koningsdag = new \DateTime("$jaar-04-27"); | |
// Als Koningsdag op zondag valt is het de dag ervoor | |
if ($koningsdag->format('w') === '0') { | |
$koningsdag->sub(new DateInterval('P1D')); | |
} | |
// berekend | |
$pasen = new \DateTime(); | |
$pasen->setTimestamp(\easter_date($jaar)); // bedankt PHP | |
$paasMaandag = clone $pasen; | |
$paasMaandag->add(new \DateInterVal('P1D')); // 1 dag na pasen | |
$goedeVrijdag = clone $pasen; | |
$goedeVrijdag->sub(new \DateInterval('P2D')); // 2 dag voor pasen | |
$olhHemelvaart = clone $pasen; | |
$olhHemelvaart->add(new \DateInterVal('P39D')); // 39 dagen na pasen | |
$pinksteren = clone $olhHemelvaart; | |
$pinksteren->add(new \DateInterVal('P10D')); // 10 dagen na OLH hemelvaart | |
$pinksterMaandag = clone $pinksteren; | |
$pinksterMaandag->add(new \DateInterVal('P1D')); // 1 dag na pinksteren | |
echo "\nFeestdagen Nederland $jaar\n--------------------------\n\n" . | |
$format($nieuwjaar, 'Nieuwjaar') . | |
$format($goedeVrijdag, 'Goede vrijdag') . | |
$format($pasen, 'Pasen') . | |
$format($paasMaandag, 'Paasmaandag') . | |
$format($koningsdag, 'Koningsdag') . | |
$format($bevrijdingsdag, 'Bevrijdingsdag') . | |
$format($olhHemelvaart, 'O.L.H. Hemelvaart') . | |
$format($pinksteren, 'Pinksteren') . | |
$format($pinksterMaandag, 'Pinkstermaandag') . | |
$format($kerstmis, 'Kerstmis') . | |
$format($tweedekerstdag, '2e Kerstdag') . | |
"\n"; |
met dank !
direct in gebruik genomen voor de feestdagen te tonen in mijn applicatie
Allicht handig er bij te vermelden dat dit een Belgische lijst is.
Voor Nederlanders mist hier bijvoorbeeld Bevrijdingsdag (5 mei) en kennen we Wapenstilstand niet. In NL hebben we Koningsdag, dat is op 27 april tenzij dat dat op een zondag valt, anders de dag ervoor:
$koningsdag = new \DateTime($jaar . "-04-27");
if ($koningsdag->format('w') == 0)
$koningsdag->sub(new DateInterval('P1D'));
Ook is aan te raden expliciet de tijdzone in te stellen, bij mij zat 'ie er anders een dag naast:
Zet dit tussen regel 20 en 21: $pasen->setTimezone(new DateTimeZone('Europe/Amsterdam'));
GEWELDIG.
Hier was ik al lange tijd naar op zoek.
Is dit ook te gebruiken als feestdagen in een tabel worden getoond.
Als voorbeeld "Nieuwjaarsdag, Maandag 1 jan 2015".
Eerste kolom : de dag (Maandag)
Tweede kolom : 1
Derde kolom : jan
Vierde kolom : 2015
Graag in het Nederlands met NL feestdagen i.c.m. Moeder en Vaderdag.
Ik ben nieuw hier en weet niet hoe dit soort vragen worden verwerkt.
Graag advies als dit een verkeerde vraag is.
Bedankt! Alleen goede vrijdag klopt niet: P1D -> P2D
$goedeVrijdag->sub(new \DateInterval('P2D')); // 2 dag voor pasen
@jonathanbooij nice catch. Fixed it. Thanks!
Perfect - thx voor de share! Ik had dit juist nodig voor mijn kalender, zat al te zoeken naar een API - maar om nu 10/maand te betalen voor een paar feestdagen.. ;)
Thanks man, echt goed! @tvlooy
Bedankt kerel! Had ik net nodig :)