Once a long time ago I found an interesting document on the inter web, describing different calendar systems.
From that I made a php-class for my website that can calculate easter sunday in the gregorian calendar. Then it is easy to calculate the rest of the danish holidays as they are offset according to easter sunday (except of course those that have a fixed date).
I translated that class in to x++.
You can find it here:
Today I got talking with a colleague about calculating easter sunday so he mentioned that he had also made a version of the calculation:
So of course - being a bit nerdy - we just *had* to check if the routines arrived at the same result. So we came up with:
static void EasterTest(Args _args)
date easter(Yr yr) // Påskedag / påske søndag
int easterday, eastermonth;
g = yr mod 19;
// Gregorian Calendar
c = real2int(rounddown(yr / 100,1));
h = (c - roundDown(c/4,1)-rounddown(((8*c)+13)/25,1)+(19*g)+15) mod 30;
i = h - rounddown(h/28,1)*(1- rounddown(29 / (h+1),1) * rounddown((21-g) / 11,1));
j = (yr + (rounddown(yr/4,1))+i+2 - c + (rounddown(c/4,1))) mod 7;
l = i - j;
easterday = 3+rounddown((l+40)/44,1);
return mkdate(l+28-31*rounddown(easterday / 4,1), easterday, yr);
date dateOfEaster(Yr y)
int a = y mod 19;
int b = y div 100;
int c = y mod 100;
int d = b div 4;
int e = b mod 4;
int f = (b+8) div 25;
int g = (b-f+1) div 3;
int h = (19*a+b-d-g+15) mod 30;
int i = c div 4;
int k = c mod 4;
int l = (32+2*e+2*i-h-k) mod 7;
int m = (a+11*h+22*l) div 451;
int n = (h+l-7*m+114) div 31;
int p = (h+l-7*m+114) mod 31;
for (x = 1900; x <= 2154; x++)
if (dateOfEaster(x) != easter(x))
info(strFmt('E1=%1 E2=%2', dateOfEaster(x), easter(x)));
And the routines calculated the same dates for easter sunday.
We stopped ourselves when discussing if we should implement a tick-couting-measurement to see if my colleagues routine was faster than mine. :-)
But I think mine is slower as it uses several function calls and not pure arithmetic.