Navigation Menu

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 Feb 23, 2012

Feestdagen Belgie 2019
-----------------------

di 01 jan. 2019 : Nieuwjaar
zo 21 apr. 2019 : Pasen
ma 22 apr. 2019 : Paasmaandag
wo 01 mei  2019 : Feest van de arbeid
do 30 mei  2019 : O.L.H. Hemelvaart
zo 09 jun. 2019 : Pinksteren
ma 10 jun. 2019 : Pinkstermaandag
zo 21 jul. 2019 : Nationale feestdag
do 15 aug. 2019 : O.L.V. Hemelvaart
vr 01 nov. 2019 : Allerheiligen
ma 11 nov. 2019 : Wapenstilstand
wo 25 dec. 2019 : Kerstmis


Feestdagen Nederland 2019
--------------------------

di 01 jan. 2019 : Nieuwjaar
vr 19 apr. 2019 : Goede vrijdag
zo 21 apr. 2019 : Pasen
ma 22 apr. 2019 : Paasmaandag
za 27 apr. 2019 : Koningsdag
zo 05 mei  2019 : Bevrijdingsdag
do 30 mei  2019 : O.L.H. Hemelvaart
zo 09 jun. 2019 : Pinksteren
ma 10 jun. 2019 : Pinkstermaandag
wo 25 dec. 2019 : Kerstmis
do 26 dec. 2019 : 2e Kerstdag

@kingkorf
Copy link

Bedankt kerel! Had ik net nodig :)

@Oldertarl
Copy link

met dank !
direct in gebruik genomen voor de feestdagen te tonen in mijn applicatie

@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