Skip to content

Instantly share code, notes, and snippets.

@tvlooy
Last active March 25, 2024 21:40
Show Gist options
  • Star 21 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save tvlooy/1894247 to your computer and use it in GitHub Desktop.
Save tvlooy/1894247 to your computer and use it in GitHub Desktop.
Feestdagen berekenen
<?php
// (c) Tom Van Looy <tom@ctors.net> 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";
@tvlooy
Copy link
Author

tvlooy commented May 3, 2019

@jonathanbooij nice catch. Fixed it. Thanks!

Copy link

ghost commented May 7, 2019

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.. ;)

@adnanjaw
Copy link

Thanks man, echt goed! @tvlooy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment