Calculating a leap year
The correct calculation of a leap year was first introduced by pope Gregor in 1582. The Gregorian Calendar is still commonly used in most parts of the world. Before that, the leap years were simply defined being every 4th year.
public static bool IsLeapYear(int year) { if (year % 100 == 0) { if (year % 400 == 0) { return true; } else if (year % 4 == 0) { return true; } } return false; }
The algorithm is fairly simple:
- If the year is divisable by 4 but not by 100, it is a leap year (e.g. 2008).
- If the year is divisable by 100 but not by 400, it is not a leap year (e.g. 2100).
- If the year is divisable by 400 it is a leap year (e.g. 2000).
Calculating the Date of Easter Sunday
All christian holidays in Germany that are not at a fixed date can be calculated relative to Easter Sunday. The following algorithm finds the date of easter sunday in a given year.
public static DateTime GetEasterSunday(int year) { int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0; a = year % 19; b = year / 100; c = (8 * b + 13) / 25 - 2; d = b - (year / 400) - 2; e = (19 * (year % 19) + ((15 - c + d) % 30)) % 30; if (e == 28) { if (a > 10) { e = 27; } } else if (e == 29) { e = 28; } f = (d + 6 * e + 2 * (year % 4) + 4 * (year % 7) + 6) % 7; DateTime retDate = new DateTime(year, 3, 1); return retDate.AddDays(e + f + 21); }
Calculating German Holidays
The following function returns a list of the common German holidays. Variable christian holidays are based on the date of Easter Sunday, which is calculated using the algorithm above.
public static DateTime[] GetHolidays(int year) { List<DateTime> list = new List<DateTime>(); for (DateTime day = new DateTime(year, 1, 1); day < new DateTime(++year, 1, 1); day = day.AddDays(1)) { if (IsHoliday(day)) list.Add(day); } return list.ToArray(); } public static bool IsHoliday(DateTime day) { // Neujahr if (day.Month == 1 && day.Day == 1) return true; // Ostern DateTime osterSonntag = GetEasterSunday(day.Year); if (day == osterSonntag.AddDays(-2)) return true; if (day == osterSonntag) return true; if (day == osterSonntag.AddDays(1)) return true; // Maifeiertag if (day.Month == 5 && day.Day == 1) return true; // Christi Himmelfahrt if (day == osterSonntag.AddDays(39)) return true; // Pfingstmontag if (day == osterSonntag.AddDays(50)) return true; // Fronleichnam if (day == osterSonntag.AddDays(60)) return true; // TdDE if (day.Month == 10 && day.Day == 3) return true; // Allerheiligen if (day.Month == 11 && day.Day == 1) return true; // Weihnachten if (day.Month == 12 && (day.Day == 25 || day.Day == 26)) return true; return false; }