Feedback

C# - Kalenderwochen nach ISO-Norm

Veröffentlicht von am 9/26/2008
(1 Bewertungen)
~~~ 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;
        }
Abgelegt unter Wochen, Kalenderwochen.

3 Kommentare zum Snippet

Günther Foidl schrieb am 9/26/2008:
Wow, so viel Aufwand - wenn so einfach geht
 
public static int Kalenderwoche(DateTime datum)
{
Calendar kalender = CultureInfo.CurrentCulture.Calendar;

return kalender.GetWeekOfYear(
datum,
CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday);
}
aleyaley schrieb am 9/26/2008:
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
marioV schrieb am 9/23/2015:
Richtig, das Ende wird nicht berücksichtigt! Bsp. 31.12.2014 gehört nicht zur KW 53 sondern zur KW 1

Lösung:
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;
}
 

Logge dich ein, um hier zu kommentieren!