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

7voto

johh Punkte 121

In .NET 3.0 und später können Sie die ISOWeek.GetWeekOfDate-Methode verwenden.

Beachten Sie, dass das Jahr im Jahr + Wochennummer-Format möglicherweise vom Jahr des DateTime abweicht, aufgrund von Wochen, die das Jahr überschreiten.

4voto

Rainer Punkte 753

C# in PowerShell übersetzen, übernommen aus dem obigen Code von il_guru:

function GetWeekOfYear([datetime] $inputDate)
{
   $day = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetDayOfWeek($inputDate)
   if (($day -ge [System.DayOfWeek]::Monday) -and ($day -le [System.DayOfWeek]::Wednesday))
   {
      $inputDate = $inputDate.AddDays(3)
   }

   # Gib die Woche unseres angepassten Tages zurück
   $weekofYear = [System.Globalization.CultureInfo]::InvariantCulture.Calendar.GetWeekOfYear($inputDate, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [System.DayOfWeek]::Monday)
   return $weekofYear
}

4voto

Jogge Punkte 1472

Hier ist eine Erweiterungsversion und eine nullable Version von il_guru's Antwort.

Erweiterung:

public static int GetIso8601WeekOfYear(this DateTime time)
{
    var day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        time = time.AddDays(3);
    }

    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

Nullable:

public static int? GetIso8601WeekOfYear(this DateTime? time)
{
    return time?.GetIso8601WeekOfYear();
}

Verwendungen:

new DateTime(2019, 03, 15).GetIso8601WeekOfYear(); //ergibt 11
((DateTime?) new DateTime(2019, 03, 15)).GetIso8601WeekOfYear(); //ergibt 11
((DateTime?) null).GetIso8601WeekOfYear(); //ergibt null

2voto

Donskikh Andrei Punkte 1972
var cultureInfo = CultureInfo.CurrentCulture;
var calendar = cultureInfo.Calendar;

var calendarWeekRule = cultureInfo.DateTimeFormat.CalendarWeekRule;
var firstDayOfWeek = cultureInfo.DateTimeFormat.FirstDayOfWeek;
var lastDayOfWeek = cultureInfo.LCID == 1033 //En-us
                    ? DayOfWeek.Saturday
                    : DayOfWeek.Sunday;

var lastDayOfYear = new DateTime(date.Year, 12, 31);

var weekNumber = calendar.GetWeekOfYear(date, calendarWeekRule, firstDayOfWeek);

 //Überprüfen, ob dies die letzte Woche im Jahr ist und sie nicht die ganze Woche einnimmt
return weekNumber == 53 && lastDayOfYear.DayOfWeek != lastDayOfWeek 
       ? 1  
       : weekNumber;

Es funktioniert gut sowohl für die US- als auch für die russische Kultur. ISO 8601 wird ebenfalls richtig sein, denn die russische Woche beginnt am Montag.

2voto

B-Art Punkte 13

In PowerShell 7.x.y: Sie benötigen beide der folgenden Codezeilen, wenn Sie die entsprechende Woche des Jahres benötigen.

[System.Globalization.ISOWeek]::GetWeekOfYear((get-date))
[System.Globalization.ISOWeek]::GetYear((get-date))

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