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";
@Janneman84
Copy link

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

@CdeF
Copy link

CdeF commented Apr 12, 2015

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.

@jonathanbooij
Copy link

Bedankt! Alleen goede vrijdag klopt niet: P1D -> P2D
$goedeVrijdag->sub(new \DateInterval('P2D')); // 2 dag voor pasen

@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