using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace BlackDragon.FeierTage {
/// <summary>
/// Und nochmal eine Feiertagsberechnung
/// </summary>
public class FeierTage {
private List<FeierTag> feiertage = new List<FeierTag>();
public FeierTage() {
Initial();
}
/// <summary>
/// Den möglichen Feiertags anhand des Datums und des jeweiligen Bundes Landes ermitteln
/// </summary>
/// <param name="datum">Das Datum, daß zur ermittlung herrangezogen werden soll</param>
/// <param name="land">Das jeweilige Land</param>
/// <returns>Der jeweilige Feiertag als Text</returns>
public String GetFeiertag(DateTime datum, Land land) {
// Liste der Feiertage durchgehen
foreach (FeierTag f in feiertage) {
if (datum.ToShortDateString().Equals(f.GetDatum(GetOstersonntag(datum.Year)).ToShortDateString())) {
// Prüfen ob das Land enthalten ist
foreach (Land l in f.Länder) {
if (land == l) {
return f.Feiertag;
}
}
}
}
return "";
}
/// <summary>
/// Einfache Abfrage ob das übergeben Datum in dem jeweiligen Land ein Feiertag ist
/// </summary>
/// <param name="datum">Das Datum, daß zur ermittlung herrangezogen werden soll</param>
/// <param name="land">Das jeweilige Land</param>
/// <returns>Wahr oder Falsch</returns>
public Boolean IsFeiertag(DateTime date, Land land) {
return (GetFeiertag(date, land).Length > 0);
}
/// <summary>
/// Errechnet das Datum des Ostersonntags aus dem übergebenen Jahr
/// </summary>
/// <param name="int">Das Jahr in YYYY Schreibweise</param>
/// <returns>Das errechnete Datum des Ostersonnsags in dem angegebene Jahr</returns>
private DateTime GetOstersonntag(int jahr) {
int c;
int i;
int j;
int k;
int l;
int n;
int OsterTag;
int OsterMonat;
c = jahr / 100;
n = jahr - 19 * ((int)(jahr / 19));
k = (c - 17) / 25;
i = c - c / 4 - ((int)(c - k) / 3) + 19 * n + 15;
i = i - 30 * ((int)(i / 30));
i = i - (i / 28) * ((int)(1 - (i / 28)) * ((int)(29 / (i + 1))) * ((int)(21 - n) / 11));
j = jahr + ((int)jahr / 4) + i + 2 - c + ((int)c / 4);
j = j - 7 * ((int)(j / 7));
l = i - j;
OsterMonat = 3 + ((int)(l + 40) / 44);
OsterTag = l + 28 - 31 * ((int)OsterMonat / 4);
return Convert.ToDateTime(OsterTag.ToString() + "." + OsterMonat + "." + jahr);
}
/// <summary>
/// Die einzelnen möglichen Feiertage
/// kan natürlich noch erweitert werden
/// </summary>
private void Initial() {
Land[] alle = new Land[] { Land.Baden_Würtenberg, Land.Bayern, Land.Berlin, Land.Brandenburg, Land.Bremen, Land.Hamburg, Land.Hessen, Land.Mecklenburg_Vorpommern, Land.Niedersachsen, Land.Nordrhein_Westfalen, Land.Rheinland_Pfalz, Land.Saarland, Land.Sachsen, Land.Sachsen_Anhalt, Land.Schleswig_Holstein, Land.Thüringen };
feiertage.Add(new FeierTag("Neujahr","01.01", FeiertagsArt.Fester_Feiertag, alle));
feiertage.Add(new FeierTag("Heiligen Drei Könige", "06.01", FeiertagsArt.Fester_Feiertag, new Land[] { Land.Baden_Würtenberg, Land.Bayern, Land.Sachsen_Anhalt }));
feiertage.Add(new FeierTag("Karfreitag", -2, FeiertagsArt.Bewegliche_Feiertag, alle));
feiertage.Add(new FeierTag("Ostersonntag", 0, FeiertagsArt.Bewegliche_Feiertag, alle));
feiertage.Add(new FeierTag("Ostermontag", 1, FeiertagsArt.Bewegliche_Feiertag, alle));
feiertage.Add(new FeierTag("Tag der Arbeit", "01.05", FeiertagsArt.Fester_Feiertag, alle));
feiertage.Add(new FeierTag("Christi Himmelfahrt", 39, FeiertagsArt.Bewegliche_Feiertag , alle));
feiertage.Add(new FeierTag("Pfingstsonntag", 49, FeiertagsArt.Bewegliche_Feiertag, alle));
feiertage.Add(new FeierTag("Pfingstmontag", 50, FeiertagsArt.Bewegliche_Feiertag, alle));
feiertage.Add(new FeierTag("Fronleichnam", 60, FeiertagsArt.Bewegliche_Feiertag, new Land[] { Land.Baden_Würtenberg, Land.Bayern, Land.Hessen, Land.Nordrhein_Westfalen, Land.Rheinland_Pfalz,Land.Saarland}));
feiertage.Add(new FeierTag("Mariä Himmelfahrt", "15.08", FeiertagsArt.Fester_Feiertag, new Land[] { Land.Saarland }));
feiertage.Add(new FeierTag("Tag der dt. Einheit", "03.10", FeiertagsArt.Fester_Feiertag, alle ));
feiertage.Add(new FeierTag("Allerheiligen", "01.11", FeiertagsArt.Fester_Feiertag, new Land[] { Land.Baden_Würtenberg,Land.Bayern,Land.Nordrhein_Westfalen,Land.Rheinland_Pfalz,Land.Saarland }));
feiertage.Add(new FeierTag("1. Weinachtstag", "25.12", FeiertagsArt.Fester_Feiertag, alle));
feiertage.Add(new FeierTag("2. Weinachtstag", "26.12", FeiertagsArt.Fester_Feiertag, alle));
}
}
/// <summary>
/// Die eigentliche Klasse der einzelnen Feiertage
/// </summary>
internal class FeierTag {
private FeiertagsArt art;
private string feiertag;
private DateTime datum;
private string testDatum;
private int tageHinzu;
private Land[] länder;
public String Feiertag {
get {
return this.feiertag;
}
}
public DateTime Datum {
get {
return this.datum;
}
}
public Land[] Länder {
get {
return länder;
}
}
internal FeierTag(String feiertag, String testDatum, FeiertagsArt art, Land[] länder) {
this.feiertag = feiertag;
this.testDatum = testDatum;
this.tageHinzu = 0;
this.art = art;
this.länder = länder;
}
internal FeierTag(String feiertag, int tageHinzu, FeiertagsArt art, Land[] länder) {
this.feiertag = feiertag;
this.tageHinzu = tageHinzu;
this.art = art;
this.länder = länder;
}
public DateTime GetDatum(DateTime osterSonntag) {
if (this.art != FeiertagsArt.Fester_Feiertag) {
datum = osterSonntag.AddDays(this.tageHinzu);
} else {
datum = DateTime.Parse(testDatum + "." + osterSonntag.Year);
}
return DateTime.Parse(datum.Day.ToString() + "." + datum.Month.ToString() +"."+ osterSonntag.Year);
}
}
public enum Land {
Baden_Würtenberg,
Bayern,
Berlin,
Brandenburg,
Bremen,
Hamburg,
Hessen,
Mecklenburg_Vorpommern,
Niedersachsen,
Nordrhein_Westfalen,
Rheinland_Pfalz,
Saarland,
Sachsen,
Sachsen_Anhalt,
Schleswig_Holstein,
Thüringen
}
public enum FeiertagsArt {
Fester_Feiertag,
Bewegliche_Feiertag
}
}