Sprache: C#
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.
[code]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);[/code]
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;
}
}
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;
}
}
Alte URL:
/snippet/datetime-erweiterungen/13089