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;
}
}