Sprache: C#
Eine Feiertagsberechnung aufgrund der Osterformel
/// <summary>
/// Teste das übergeben Datum auf einen Feiertag
/// </summary>
/// <param name="DateTime">Das Datum, daß auf einen Beweglichen Feiertag geprüft werden soll</param>
/// <returns>Wenn das übergebene Datum auf einen Feriertag fällt dan wird dieser Feiertag zurückgegeben</returns>
public string GetFeiertag(DateTime myDatum){
string feierTag = "";
// Datum zerlegen und für den Test eines FEsten Feiertages zusammenbauen
String testDate = (myDatum.Day.ToString() +"/"+ myDatum.Month.ToString());
switch(testDate){
case "1/1":
feierTag = "Neujahr";
break;
case "1/5":
feierTag = "Tag der Arbeit";
break;
case "15/8":
feierTag = "Mariae Himmelfahrt";
break;
case "3/10":
feierTag = "Tag der dt. Einheit";
break;
case "1/11":
feierTag = "Allerheiligen";
break;
case "25/12":
feierTag = "1. Weihnachtstag";
break;
case "26/12":
feierTag = "2. Weihnachtstag";
break;
default:
feierTag = GetMovFeierTag(myDatum);
break;
}
return feierTag;
}
/// <summary>
/// Teste das übergeben Datum auf einen Beweglichen Feiertag
/// </summary>
/// <param name="DateTime">Das Datum, daß auf einen Beweglichen Feiertag geprüft werden soll</param>
/// <returns>Der bewegliche Feiertag oder halt nichts</returns>
private String GetMovFeierTag(DateTime myDatum){
int Jahr = myDatum.Year;
DateTime Ostersonntag = GetOstersonntag(Jahr);
if (myDatum == Ostersonntag.AddDays(0)){
return "OsterSonntag";
}
if (myDatum == Ostersonntag.AddDays(-2)){
return "Karfreitag";
}
if (myDatum == Ostersonntag.AddDays(1)){
return "Ostermontag";
}
if (myDatum == Ostersonntag.AddDays(39)){
return "Christi Himmelfahrt";
}
if (myDatum == Ostersonntag.AddDays(49)){
return "Pfingstsonntag";
}
if (myDatum == Ostersonntag.AddDays(50)){
return "Pfingstmontag";
}
if (myDatum == Ostersonntag.AddDays(60)){
return "Fronleichnam";
}
return "";
}
/// <summary>
/// Errechnet das Datum des Ostersonntags aus dem übergebenen Jahr
/// </summary>
/// <param name="int">Das Jahr in YYYY Schreibweise</param>
/// <returns>Das Datum des Ostersonntags in dem Übergebe Jahr</returns>
private DateTime GetOstersonntag(int jahr){
DateTime OsterSonntag;
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>
/// Teste das übergeben Datum auf einen Feiertag
/// </summary>
/// <param name="DateTime">Das Datum, daß auf einen Beweglichen Feiertag geprüft werden soll</param>
/// <returns>Wenn das übergebene Datum auf einen Feriertag fällt dan wird dieser Feiertag zurückgegeben</returns>
public string GetFeiertag(DateTime myDatum){
string feierTag = "";
// Datum zerlegen und für den Test eines FEsten Feiertages zusammenbauen
String testDate = (myDatum.Day.ToString() +"/"+ myDatum.Month.ToString());
switch(testDate){
case "1/1":
feierTag = "Neujahr";
break;
case "1/5":
feierTag = "Tag der Arbeit";
break;
case "15/8":
feierTag = "Mariae Himmelfahrt";
break;
case "3/10":
feierTag = "Tag der dt. Einheit";
break;
case "1/11":
feierTag = "Allerheiligen";
break;
case "25/12":
feierTag = "1. Weihnachtstag";
break;
case "26/12":
feierTag = "2. Weihnachtstag";
break;
default:
feierTag = GetMovFeierTag(myDatum);
break;
}
return feierTag;
}
/// <summary>
/// Teste das übergeben Datum auf einen Beweglichen Feiertag
/// </summary>
/// <param name="DateTime">Das Datum, daß auf einen Beweglichen Feiertag geprüft werden soll</param>
/// <returns>Der bewegliche Feiertag oder halt nichts</returns>
private String GetMovFeierTag(DateTime myDatum){
int Jahr = myDatum.Year;
DateTime Ostersonntag = GetOstersonntag(Jahr);
if (myDatum == Ostersonntag.AddDays(0)){
return "OsterSonntag";
}
if (myDatum == Ostersonntag.AddDays(-2)){
return "Karfreitag";
}
if (myDatum == Ostersonntag.AddDays(1)){
return "Ostermontag";
}
if (myDatum == Ostersonntag.AddDays(39)){
return "Christi Himmelfahrt";
}
if (myDatum == Ostersonntag.AddDays(49)){
return "Pfingstsonntag";
}
if (myDatum == Ostersonntag.AddDays(50)){
return "Pfingstmontag";
}
if (myDatum == Ostersonntag.AddDays(60)){
return "Fronleichnam";
}
return "";
}
/// <summary>
/// Errechnet das Datum des Ostersonntags aus dem übergebenen Jahr
/// </summary>
/// <param name="int">Das Jahr in YYYY Schreibweise</param>
/// <returns>Das Datum des Ostersonntags in dem Übergebe Jahr</returns>
private DateTime GetOstersonntag(int jahr){
DateTime OsterSonntag;
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);
}
Alte URL:
/snippet/feiertagsberechnung/289
Die Feiertage in den einzelnen Bundesländer unterscheiden sich, so ist Allerheiligen beispielsweise in Hessen kein Feiertag (siehe http://de.wikipedia.org/wiki/Feiertage_%28Deutschland%29).
-yellow
Ja, das mit den Feiertagen stimmt schon aber denke mal das wäre nur eine kleine anpassung
Nuja… Maria Himmelfahrt ist auch nur im Saarland und in einigen Ortschaften im Bayern noch Feiertag. Pack‘ doch die Feiertag/Bundesland-Zuordnung in ein Array oder dergleichen… das wäre doch klasse.
Es gibt eine XML Web Service Seite dafür: http://www.holidaywebservice.com/Holidays/US/Dates/USHolidayDates.asmx?WSDL
Für den deutschsprachigen, sowie allgemein europäischen Raum befindet sich aktuell ein Webservice in der Entstehung:
http://www.feiertagskalender-service.de/
Laut dem Betreibern des Angebots ist zudem individuelles Feedback herzlich willkommen. Sehr wahrscheinlich findet man auch hier eine bequemere und garantiert richtige Lösung 🙂
In Datumsarithmetik & Co. hat man recht schnell einen Fehler verbaut. Je nach Anwendung kann das schon zu „hübschen“ Seiteneffekten führen, die leider einen ordentlichen Schaden verursachen können
Ich spreche da aus Erfahrung 🙂