293 Stimmen

Erhalte die korrekte Kalenderwoche eines bestimmten Datums

Ich habe viel gegoogelt und viele Lösungen gefunden, aber keine davon gibt mir die richtige Wochennummer für den 31.12.2012. Selbst das Beispiel auf MSDN (link) funktioniert nicht.

Der 31.12.2012 ist ein Montag, daher sollte es Woche 1 sein, aber jede Methode, die ich ausprobiert habe, gibt mir 53. Hier sind einige der Methoden, die ich ausprobiert habe:

Aus der MSDN-Bibliothek:

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
Calendar cal = dfi.Calendar;

return cal.GetWeekOfYear(date, dfi.CalendarWeekRule, dfi.FirstDayOfWeek);

Lösung 2:

return new GregorianCalendar(GregorianCalendarTypes.Localized).GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

Lösung 3:

CultureInfo ciCurr = CultureInfo.CurrentCulture;
int weekNum = ciCurr.Calendar.GetWeekOfYear(dtPassed, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
return weekNum;

Aktualisierung

Die folgende Methode gibt tatsächlich 1 zurück, wenn das Datum der 31.12.2012 ist. Mit anderen Worten, mein Problem war, dass meine Methoden den ISO-8601-Standard nicht eingehalten haben.

// Das setzt voraus, dass die Wochen mit Montag beginnen.
// Woche 1 ist die 1. Woche des Jahres mit einem Donnerstag darin.
public static int GetIso8601WeekOfYear(DateTime time)
{
    // Ernsthaftes Schummeln. Wenn es Montag, Dienstag oder Mittwoch ist, wird es
    // die gleiche Wochennummer wie der Donnerstag, Freitag oder Samstag sein,
    // und wir bekommen diese immer richtig
    DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    // Gib die Woche unseres angepassten Tages zurück
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

0voto

NKCSS Punkte 2713

Basiert auf der Antwort von il_guru habe ich diese Version für meine eigenen Bedürfnisse erstellt, die auch den Jahresbestandteil zurückgibt.

    /// 
    /// Dies setzt voraus, dass die Wochen mit dem Montag beginnen.
    /// Woche 1 ist die 1. Woche des Jahres mit einem Donnerstag darin.
    /// 
    /// Das Datum, für das die Wochennummer berechnet werden soll.
    /// Das Jahr und die Wochennummer
    /// 
    /// Basierend auf der Stack Overflow Antwort: https://stackoverflow.com/a/11155102
    /// 
    public static (short year, byte week) GetIso8601WeekOfYear(DateTime time)
    {
        // Ernsthaft betrügen. Wenn es Montag, Dienstag oder Mittwoch ist, dann wird es die gleiche Wochennummer haben wie Donnerstag, Freitag oder Samstag,
        // und wir bekommen das immer richtig
        DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
        if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
        {
            time = time.AddDays(3);
        }
        // Gib die Woche unseres angepassten Tages zurück
        var week = (byte)CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
        return ((short)(week >= 52 & time.Month == 1 ? time.Year - 1 : time.Year), week);
    }

0voto

Imran Punkte 1795
  DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo;
  DateTime date1 = new DateTime(2011, 1, 1);
  Calendar cal = dfi.Calendar;

  Console.WriteLine("{0:d}: Woche {1} ({2})", date1, 
                    cal.GetWeekOfYear(date1, dfi.CalendarWeekRule, 
                                      dfi.FirstDayOfWeek),
                    cal.ToString().Substring(cal.ToString().LastIndexOf(".") + 1));

0voto

Samy Arous Punkte 6764

Die Frage lautet: Wie definieren Sie, ob eine Woche im Jahr 2012 oder im Jahr 2013 ist? Ihre Annahme ist wohl, dass da 6 Tage der Woche im Jahr 2013 sind, diese Woche also als erste Woche des Jahres 2013 markiert werden sollte.

Bin mir nicht sicher, ob das der richtige Weg ist. Diese Woche begann 2012 (am Montag, 31. Dezember), daher sollte sie als letzte Woche des Jahres 2012 markiert werden, und somit die 53. Woche des Jahres 2012 sein. Die erste Woche des Jahres 2013 sollte am Montag, den 7. beginnen.

Jetzt können Sie den speziellen Fall der Randwochen (erste und letzte Woche des Jahres) anhand der Informationen zum Wochentag behandeln. Es hängt alles von Ihrer Logik ab.

-1voto

Meghnath Das Punkte 135
public int GetWeekNumber()
{
   CultureInfo ciCurr = CultureInfo.CurrentCulture;
   int weekNum = ciCurr.Calendar.GetWeekOfYear(DateTime.Now, 
   CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
   return weekNum;
}

-1voto

CarlosJ Punkte 244

Ein Jahr hat 52 Wochen und 1 Tag oder 2 im Falle eines Schaltjahres (52 x 7 = 364). 2012-12-31 wäre Woche 53, eine Woche, die nur 2 Tage hätte, weil 2012 ein Schaltjahr ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X