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