Feedback

C# - Feiertagsberechnung

Veröffentlicht von am 02.11.2006
(7 Bewertungen)
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);
}

5 Kommentare zum Snippet

Yellow schrieb am 03.11.2006:
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
BlackDragon schrieb am 04.11.2006:
Ja, das mit den Feiertagen stimmt schon aber denke mal das wäre nur eine kleine anpassung
Yellow schrieb am 07.11.2006:
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.
Incognito schrieb am 19.12.2007:
Es gibt eine XML Web Service Seite dafür: http://www.holidaywebservice.com/Holidays/US/Dates/USHolidayDates.asmx?WSDL
Thorsten-M. schrieb am 06.03.2014:
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 :)
 

Logge dich ein, um hier zu kommentieren!