Sprache: C#
~~~ Nach ISO 8601 ~~~
Zählt die Kalenderwochen des selektierten Jahres. Die erste Kalenderwoche ist diejenige,in der mindestens 4
Tage des neuen Jahres enthalten sind. Es wird ein 2-Dimensionaler Array zurückgegeben,
wobei die 1. Dimension die Kalenderwochen und die 2. Dimension Das Datum des jeweiligen Wochentags ist.
Bsp.: [23, 0] = 24. KW Montag; [0, 6] = 1. KW Sonntag
Größe des Arrays: [anzKW, 7]
Prüfung auf leere Felder notwendig! Wenn Feld leer –> Datum = 01.01.0001
public Array getDatesFromWeekInput_ISO()
{
int year = jahreingeben;
int anzKW = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(new DateTime(year, 12, 31), System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek);
DateTime startdate = new DateTime(year, 1, 1);
DateTime[,] weeksanddates = new DateTime[anzKW, 7];
for (int i = -1; i < anzKW; i++)
{
for (int j = 0; j < 7; j++)
{
DateTime tempdate = startdate;
if (i == -1)
{
if (tempdate.DayOfWeek == DayOfWeek.Monday)
{
weeksanddates[i + 1, 0] = tempdate;
weeksanddates[i + 1, 1] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 2] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 3] = new DateTime(year, 1, 4);
weeksanddates[i + 1, 4] = new DateTime(year, 1, 5);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 6);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 7);
startdate = tempdate.AddDays(6);
j = 7; i = 0;
}
else if (tempdate.DayOfWeek == DayOfWeek.Tuesday)
{
weeksanddates[i + 1, 0] = new DateTime((year - 1), 12, 31);
weeksanddates[i + 1, 1] = tempdate;
weeksanddates[i + 1, 2] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 3] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 4] = new DateTime(year, 1, 4);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 5);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 6);
startdate = tempdate.AddDays(5);
j = 7; i = 0;
}
else if (tempdate.DayOfWeek == DayOfWeek.Wednesday)
{
weeksanddates[i + 1, 0] = new DateTime((year - 1), 12, 30);
weeksanddates[i + 1, 1] = new DateTime((year - 1), 12, 31);
weeksanddates[i + 1, 2] = tempdate;
weeksanddates[i + 1, 3] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 4] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 4);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 5);
startdate = tempdate.AddDays(4);
j = 7; i = 0;
}
else if (tempdate.DayOfWeek == DayOfWeek.Thursday)
{
weeksanddates[i + 1, 0] = new DateTime((year - 1), 12, 29);
weeksanddates[i + 1, 1] = new DateTime((year - 1), 12, 30);
weeksanddates[i + 1, 2] = new DateTime((year - 1), 12, 31);
weeksanddates[i + 1, 3] = tempdate;
weeksanddates[i + 1, 4] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 4);
startdate = tempdate.AddDays(3);
j = 7; i = 0;
}
//weniger als 4 Tage der Woche liegen im neuen Jahr
else if (tempdate.DayOfWeek == DayOfWeek.Friday)
{
j = 7; i = -1;
tempdate = tempdate.AddDays(3);
}
else if (tempdate.DayOfWeek == DayOfWeek.Saturday)
{
//j=0 + i=1 + adddays(3)
j = 7; i = -1;
tempdate = tempdate.AddDays(2);
}
else if (tempdate.DayOfWeek == DayOfWeek.Sunday)
{
j = 7; i = -1;
tempdate = tempdate.AddDays(1);
}
}
else
{
weeksanddates[i, j] = tempdate;
}
if (tempdate.Day == 31 && tempdate.Month == 12)
{
//2008 --> 31. = mi
//2009 --> 31. = do
if (tempdate.DayOfWeek == DayOfWeek.Monday)
{
//Mo aus Array löschen
weeksanddates[i, 0] = new DateTime(1, 1, 1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Tuesday)
{
//Mo,Di aus Array löschen
weeksanddates[i, 0] = new DateTime(1, 1, 1);
weeksanddates[i, 1] = new DateTime(1, 1, 1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Wednesday)
{
//Mo,Di,Mi aus Array löschen
weeksanddates[i, 0] = new DateTime(1, 1, 1);
weeksanddates[i, 1] = new DateTime(1, 1, 1);
weeksanddates[i, 2] = new DateTime(1, 1, 1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Thursday)
{
//Fr,Sa,So zu array hinzufügen
weeksanddates[i, 4] = tempdate.AddDays(1);
weeksanddates[i, 5] = tempdate.AddDays(2);
weeksanddates[i, 6] = tempdate.AddDays(3);
}
else if (tempdate.DayOfWeek == DayOfWeek.Friday)
{
//Sa,So zu array hinzufügen
weeksanddates[i, 5] = tempdate.AddDays(1);
weeksanddates[i, 6] = tempdate.AddDays(2);
}
else if (tempdate.DayOfWeek == DayOfWeek.Saturday)
{
//So zu array hinzufügen
weeksanddates[i, 5] = tempdate.AddDays(1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Sunday)
{
//Keine Aktion, Sonntag ist letzter Tag im Jahr
}
break; //Abbruch der kompletten Schleife
}
tempdate = startdate.AddDays(1);
startdate = tempdate;
}
}
return weeksanddates;
}
public Array getDatesFromWeekInput_ISO()
{
int year = jahreingeben;
int anzKW = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(new DateTime(year, 12, 31), System.Globalization.CalendarWeekRule.FirstFourDayWeek, System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek);
DateTime startdate = new DateTime(year, 1, 1);
DateTime[,] weeksanddates = new DateTime[anzKW, 7];
for (int i = -1; i < anzKW; i++)
{
for (int j = 0; j < 7; j++)
{
DateTime tempdate = startdate;
if (i == -1)
{
if (tempdate.DayOfWeek == DayOfWeek.Monday)
{
weeksanddates[i + 1, 0] = tempdate;
weeksanddates[i + 1, 1] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 2] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 3] = new DateTime(year, 1, 4);
weeksanddates[i + 1, 4] = new DateTime(year, 1, 5);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 6);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 7);
startdate = tempdate.AddDays(6);
j = 7; i = 0;
}
else if (tempdate.DayOfWeek == DayOfWeek.Tuesday)
{
weeksanddates[i + 1, 0] = new DateTime((year - 1), 12, 31);
weeksanddates[i + 1, 1] = tempdate;
weeksanddates[i + 1, 2] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 3] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 4] = new DateTime(year, 1, 4);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 5);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 6);
startdate = tempdate.AddDays(5);
j = 7; i = 0;
}
else if (tempdate.DayOfWeek == DayOfWeek.Wednesday)
{
weeksanddates[i + 1, 0] = new DateTime((year - 1), 12, 30);
weeksanddates[i + 1, 1] = new DateTime((year - 1), 12, 31);
weeksanddates[i + 1, 2] = tempdate;
weeksanddates[i + 1, 3] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 4] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 4);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 5);
startdate = tempdate.AddDays(4);
j = 7; i = 0;
}
else if (tempdate.DayOfWeek == DayOfWeek.Thursday)
{
weeksanddates[i + 1, 0] = new DateTime((year - 1), 12, 29);
weeksanddates[i + 1, 1] = new DateTime((year - 1), 12, 30);
weeksanddates[i + 1, 2] = new DateTime((year - 1), 12, 31);
weeksanddates[i + 1, 3] = tempdate;
weeksanddates[i + 1, 4] = new DateTime(year, 1, 2);
weeksanddates[i + 1, 5] = new DateTime(year, 1, 3);
weeksanddates[i + 1, 6] = new DateTime(year, 1, 4);
startdate = tempdate.AddDays(3);
j = 7; i = 0;
}
//weniger als 4 Tage der Woche liegen im neuen Jahr
else if (tempdate.DayOfWeek == DayOfWeek.Friday)
{
j = 7; i = -1;
tempdate = tempdate.AddDays(3);
}
else if (tempdate.DayOfWeek == DayOfWeek.Saturday)
{
//j=0 + i=1 + adddays(3)
j = 7; i = -1;
tempdate = tempdate.AddDays(2);
}
else if (tempdate.DayOfWeek == DayOfWeek.Sunday)
{
j = 7; i = -1;
tempdate = tempdate.AddDays(1);
}
}
else
{
weeksanddates[i, j] = tempdate;
}
if (tempdate.Day == 31 && tempdate.Month == 12)
{
//2008 --> 31. = mi
//2009 --> 31. = do
if (tempdate.DayOfWeek == DayOfWeek.Monday)
{
//Mo aus Array löschen
weeksanddates[i, 0] = new DateTime(1, 1, 1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Tuesday)
{
//Mo,Di aus Array löschen
weeksanddates[i, 0] = new DateTime(1, 1, 1);
weeksanddates[i, 1] = new DateTime(1, 1, 1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Wednesday)
{
//Mo,Di,Mi aus Array löschen
weeksanddates[i, 0] = new DateTime(1, 1, 1);
weeksanddates[i, 1] = new DateTime(1, 1, 1);
weeksanddates[i, 2] = new DateTime(1, 1, 1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Thursday)
{
//Fr,Sa,So zu array hinzufügen
weeksanddates[i, 4] = tempdate.AddDays(1);
weeksanddates[i, 5] = tempdate.AddDays(2);
weeksanddates[i, 6] = tempdate.AddDays(3);
}
else if (tempdate.DayOfWeek == DayOfWeek.Friday)
{
//Sa,So zu array hinzufügen
weeksanddates[i, 5] = tempdate.AddDays(1);
weeksanddates[i, 6] = tempdate.AddDays(2);
}
else if (tempdate.DayOfWeek == DayOfWeek.Saturday)
{
//So zu array hinzufügen
weeksanddates[i, 5] = tempdate.AddDays(1);
}
else if (tempdate.DayOfWeek == DayOfWeek.Sunday)
{
//Keine Aktion, Sonntag ist letzter Tag im Jahr
}
break; //Abbruch der kompletten Schleife
}
tempdate = startdate.AddDays(1);
startdate = tempdate;
}
}
return weeksanddates;
}
Alte URL:
/snippet/kalenderwochen-nach-iso-norm/964
Wow, so viel Aufwand – wenn so einfach geht
[code]
public static int Kalenderwoche(DateTime datum)
{
Calendar kalender = CultureInfo.CurrentCulture.Calendar;
return kalender.GetWeekOfYear(
datum,
CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday);
}
[/code]
Hallo, ja, was du gemacht hast ist auch einfach, jedoch benötige ich nicht nur die Kalenderwoche in der das Datum liegt, sondern ich benötige alle Daten die in einer Kalenderwoche liegen, und soweit ich weiß kann man das leider nicht so einfach abfragen.
So umfangreich ist es leider auch nur wegen dieser ISO-Norm geworden die beschreibt welche die erste KW ist.
btw ist mir aufgefallen das CalendarWeekRule.FirstFourDayWeek wahrscheinlich nur den anfang eines Jahres berücksichtigt, jedoch das ende nicht.
Grüße
Richtig, das Ende wird nicht berücksichtigt! Bsp. 31.12.2014 gehört nicht zur KW 53 sondern zur KW 1
Lösung:[code]public static int Kalenderwoche(DateTime datum)
{
if (datum.DayOfWeek >= DayOfWeek.Monday)
{
datum = datum.AddDays(7 – (int)datum.DayOfWeek);
}
int kw = System.Globalization.CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(datum, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return kw;
}[/code]