Feedback

C# - DateTime Erweiterungen

Veröffentlicht von am 21.11.2015
(1 Bewertungen)
Ein paar Erweiterungsfunktionen für das DateTime Objekt, die bei Kalendern nützlich sind.

Die Funktion GetHolidays() funktioniert nur für deutsche Bundesländer! Sie kann aber natürlich auch für andere Länder erweitert werden, aber die brauchte ich bisher nicht.

var ersterTagDerWoche = DateTime.Now.GetFirstDayOfWeek();
var letzterTagDesMonats = DateTime.Now.GetLastDayOfMonth();
var istWochenende = DateTime.Now.IsWeekend();
var istFeiertag = new DateTime(2015, 12, 24).IsHoliday(ExtensionsDateTime.State.BadenWürtenberg);
public static class ExtensionsDateTime
{
	/// <summary>
	/// Gibt zur angegebenen Woche den ersten Tag der Woche zurück.
	/// </summary>
	/// <param name="week">Woche</param>
	/// <returns></returns>
	public static DateTime GetFirstDayOfWeek(this DateTime week)
	{
		return week.GetFirstDayOfWeek(CultureInfo.CurrentCulture);
	}

	/// <summary>
	/// Gibt zur angegebenen Woche den ersten Tag der Woche in der entsprechenen Kultur zurück.
	/// </summary>
	/// <param name="week">Woche</param>
	/// <param name="cultureInfo">Kultur</param>
	/// <returns></returns>
	public static DateTime GetFirstDayOfWeek(this DateTime week, CultureInfo cultureInfo)
	{
		var day = week.Date;
		while (day.DayOfWeek != cultureInfo.DateTimeFormat.FirstDayOfWeek)
		{
			day = day.AddDays(-1);
		}
		return day;
	}

	/// <summary>
	/// Gibt den letzten Tag des Monats zurück.
	/// </summary>
	/// <param name="month">Monat</param>
	/// <returns></returns>
	public static DateTime GetLastDayOfMonth(this DateTime month)
	{
		return new DateTime(month.Year, month.Month, DateTime.DaysInMonth(month.Year, month.Month));
	}

	/// <summary>
	/// Prüft, ob der Tag auf ein Wochenende fällt.
	/// </summary>
	/// <param name="day">Tag</param>
	/// <returns>True, falls Wochenende, False falls nicht</returns>
	public static bool IsWeekend(this DateTime day)
	{
		return day.DayOfWeek == DayOfWeek.Saturday
			|| day.DayOfWeek == DayOfWeek.Sunday;
	}

	/// <summary>
	/// Auflistung der Bundesländer in Deutschland
	/// </summary>
	public enum State
	{
		Invariant,

		BadenWürtenberg,
		Bayern,
		Berlin,
		Brandenburg,
		Bremen,
		Hamburg,
		Hessen,
		MecklenburgVorpommern,
		Niedersachsen,
		NordrheinWestfalen,
		RheinlandPfalz,
		Saarland,
		Sachsen,
		SachsenAnhalt,
		SchleswigHolstein,
		Thüringen
	}

	private static Dictionary<int, DateTime> osterSonntagCache = new Dictionary<int, DateTime>();

	public static bool IsHoliday(this DateTime day)
	{
		return day.IsHoliday(State.Invariant);
	}

	/// <summary>
	/// Prüft, ob das Datum auf einen Feiertag zeigt.
	/// </summary>
	/// <param name="day"></param>
	/// <param name="state">Bundesland, für das der Feiertag geprüft werden soll</param>
	/// <returns></returns>
	public static bool IsHoliday(this DateTime day, State state)
	{
		return day.GetHolidays(state).Contains(day.Date);
	}


	/// <summary>
	/// Prüft, ob das Datum auf einen Feiertag zeigt.
	/// </summary>
	/// <param name="year"></param>
	/// <param name="state">Bundesland, für das der Feiertag geprüft werden soll</param>
	/// <returns></returns>
	public static List<DateTime> GetHolidays(this DateTime year, State state)
	{
		var result = new List<DateTime>();
		switch (state)
		{
			case State.SachsenAnhalt:
				result.Add(new DateTime(year.Year, 1, 6)); //Heilige Drei Könige
				break;
			case State.BadenWürtenberg:
			case State.Bayern:
				result.Add(new DateTime(year.Year, 1, 6)); //Heilige Drei Könige
				goto case State.RheinlandPfalz;
			case State.Saarland:
				result.Add(new DateTime(year.Year, 8, 15)); //Mariä Himmelfahrt
				goto case State.RheinlandPfalz;
			case State.NordrheinWestfalen:
			case State.RheinlandPfalz:
				result.Add(new DateTime(year.Year, 11, 1)); //Allerheiligen
				break;
		}

		//alle Bundesländer
		result.Add(new DateTime(year.Year, 1, 1)); //Neujahr
		result.Add(new DateTime(year.Year, 5, 1)); //Tag der Arbeit
		result.Add(new DateTime(year.Year, 10, 3)); //Tag der dt. Einheit
		result.Add(new DateTime(year.Year, 12, 25)); //1. Weihnachtstag
		result.Add(new DateTime(year.Year, 12, 26)); //2. Weihnachtstag

		DateTime osterSonntag;
		if (osterSonntagCache.ContainsKey(year.Year))
		{
			osterSonntag = osterSonntagCache[year.Year];
		}
		else
		{
			//Ostern berechnen
			int c = year.Year / 100;
			int n = year.Year - 19 * (year.Year / 19);
			int k = (c - 17) / 25;
			int i = c - c / 4 - ((c - k) / 3) + 19 * n + 15;
			i = i - 30 * (i / 30);
			i = i - (i / 28) * (1 - (i / 28)) * (29 / (i + 1)) * ((21 - n) / 11);
			int j = year.Year + (year.Year / 4) + i + 2 - c + (c / 4);
			j = j - 7 * (j / 7);
			int l = i - j;

			int monat = 3 + (l + 40) / 44;

			osterSonntag = new DateTime(year.Year, monat, l + 28 - 31 * (monat / 4));
			osterSonntagCache.Add(year.Year, osterSonntag);
		}

		result.Add(osterSonntag); //Ostersonntag
		result.Add(osterSonntag.AddDays(1)); //Ostermontag
		result.Add(osterSonntag.AddDays(-2)); //Karfreitag
		result.Add(osterSonntag.AddDays(39)); //Christi Himmelfahrt
		result.Add(osterSonntag.AddDays(49)); //Pfingstsonntag
		result.Add(osterSonntag.AddDays(50)); //Pfingstmontag

		if (state == State.BadenWürtenberg || state == State.Bayern || state == State.Hessen
			|| state == State.NordrheinWestfalen || state == State.RheinlandPfalz
			|| state == State.Saarland)
		{
			result.Add(osterSonntag.AddDays(60)); //Fronleichnam
		}

		return result;
	}
}
Abgelegt unter DateTime, Feiertag.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!