Last active
March 25, 2024 21:40
-
-
Save tvlooy/1894247 to your computer and use it in GitHub Desktop.
Feestdagen berekenen
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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"; |
@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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Bedankt! Alleen goede vrijdag klopt niet: P1D -> P2D
$goedeVrijdag->sub(new \DateInterval('P2D')); // 2 dag voor pasen