Ich habe viel gegoogelt und viele Lösungen gefunden, aber keine davon gibt mir die richtige Wochennummer für den 31.12.2012. Auch das Beispiel auf MSDN ( Link ) schlägt fehl.
2012-12-31 ist 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 MDSN-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;
Aktualisieren
Die folgende Methode gibt tatsächlich 1 zurück, wenn das Datum 2012-12-31 ist. Mit anderen Worten, mein Problem war, dass meine Methoden nicht dem ISO-8601-Standard entsprachen.
// This presumes that weeks start with Monday.
// Week 1 is the 1st week of the year with a Thursday in it.
public static int GetIso8601WeekOfYear(DateTime time)
{
// Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll
// be the same week# as whatever Thursday, Friday or Saturday are,
// and we always get those right
DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
{
time = time.AddDays(3);
}
// Return the week of our adjusted day
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
Antworten:
Wie auf dieser MSDN-Seite angegeben, gibt es einen geringfügigen Unterschied zwischen der ISO8601-Wochen- und der .Net-Wochennummerierung.
Eine bessere Erklärung finden Sie in diesem Artikel im MSDN-Blog: " ISO 8601 Week of Year-Format in Microsoft .Net "
Einfach ausgedrückt, .Net ermöglicht die Aufteilung von Wochen auf Jahre, während der ISO-Standard dies nicht tut. In dem Artikel gibt es auch eine einfache Funktion, um die richtige ISO 8601-Wochennummer für die letzte Woche des Jahres zu erhalten.
Update Die folgende Methode gibt tatsächlich 1 zurück,
2012-12-31
was in ISO 8601 (z. B. Deutschland) korrekt ist.quelle
Ein Jahr kann mehr als 52 Wochen dauern. Jedes Jahr hat 52 volle Wochen + 1 oder + 2 (Schaltjahr) Tage mehr. Sie machen eine 53. Woche wieder gut.
Sie haben also für jedes Jahr mindestens einen zusätzlichen Tag. Zwei für Schaltjahre. Werden diese zusätzlichen Tage als eigene Wochen gezählt?
Wie viele Wochen es wirklich gibt, hängt vom Starttag Ihrer Woche ab. Betrachten wir dies für 2012.
Überprüfen Sie die Einstellungen Ihrer aktuellen Kultur, um festzustellen, was als erster Tag der Woche verwendet wird.
Wie Sie sehen, ist es normal, 53 zu erhalten.
Es ist sogar möglich, eine 54. Woche zu haben. Passiert alle 28 Jahre, wenn der 1. Januar und der 31. Dezember als separate Wochen behandelt werden. Es muss auch ein Schaltjahr sein.
Zum Beispiel hatte das Jahr 2000 54 Wochen. Der 1. Januar (gesessen) war der erste einwöchige Tag und der 31. Dezember (sonntags) war der zweite einwöchige Tag.
Ausdrucke: Jahr: 2012 Woche: 54
Wenn Sie die CalendarWeekRule im obigen Beispiel in FirstFullWeek oder FirstFourDayWeek ändern, erhalten Sie 53 zurück. Lassen Sie uns den Starttag am Montag beibehalten, da es sich um Deutschland handelt.
Woche 53 beginnt also am Montag, den 31.12.2012, dauert einen Tag und endet dann.
53 ist die richtige Antwort. Ändern Sie die Kultur nach Deutschland, wenn Sie es versuchen möchten.
quelle
Das ist der Weg:
Am wichtigsten für ist der
CalendarWeekRule
Parameter.Siehe hier: https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=IT-IT&k=k(System.Globalization.CalendarWeekRule);k(TargetFrameworkMoniker-.NETFramework
quelle
Gute Nachrichten! Eine Pull-Anfrage wird hinzugefügt
System.Globalization.ISOWeek
zu .NET Core , wurde gerade zusammengeführt und ist derzeit für die Version 3.0 vorgesehen. Hoffentlich wird es in nicht allzu ferner Zukunft auf die anderen .NET-Plattformen übertragen.Der Typ hat die folgende Signatur, die die meisten Anforderungen der ISO-Woche abdecken sollte :
Den Quellcode finden Sie hier .
UPDATE : Diese APIs wurden auch in die 2.1-Version von .NET Standard aufgenommen .
quelle
Da es anscheinend keine .Net-Kultur gibt, die die korrekte ISO-8601-Wochenzahl liefert, würde ich die integrierte Wochenbestimmung lieber ganz umgehen und die Berechnung manuell durchführen, anstatt zu versuchen, eine teilweise korrekte zu korrigieren Ergebnis.
Am Ende hatte ich folgende Erweiterungsmethode:
Zunächst einmal
((int)date.DayOfWeek + 6) % 7)
bestimmt den Wochentag Zahl, 0 = Montag, 6 = Sonntag.date.AddDays(-((int)date.DayOfWeek + 6) % 7)
bestimmt das Datum des Montags vor der angeforderten Wochennummer.Drei Tage später ist der Ziel-Donnerstag, der bestimmt, in welchem Jahr die Woche ist.
Wenn Sie die (auf Null basierende) Tageszahl innerhalb des Jahres durch sieben (Abrundung) teilen, erhalten Sie die (auf Null basierende) Wochennummer im Jahr.
In c # werden die Ergebnisse der Ganzzahlberechnung implizit abgerundet.
quelle
Ticks
ist die Anzahl der 100-Nanosekunden-Inkremente seit dem 1. Januar 0001. Angesichts der Tatsache, dass ein Tag 86.400 Sekunden hat, können wir schreiben:var thursday = date.AddDays(3 - date.Ticks / 86400 / 10_000_000 % 7); return (thursday.DayOfYear - 1) / 7 + 1;
In .NET 3.0 und höher können Sie die
ISOWeek.GetWeekOfDate
-Methode verwenden .Beachten Sie, dass das Jahr im Format Jahr + Woche
DateTime
aufgrund von Wochen, die die Jahresgrenze überschreiten, vom Jahr des Jahres abweichen kann .quelle
C # zum Powershell-Port vom obigen Code von il_guru :
quelle
Der einfachste Weg, um den ISO 8601-Stil der Wochennummer mithilfe von c # und der DateTime-Klasse zu bestimmen.
Fragen Sie dies: Der Donnerstag des Jahres ist der Donnerstag dieser Woche. Die Antwort entspricht der gewünschten Wochennummer.
quelle
Es funktioniert sowohl für die US-amerikanische als auch für die russische Kultur. ISO 8601 wird auch korrekt sein, da die russische Woche am Montag beginnt.
quelle
Hier ist eine Erweiterungsversion und eine nullfähige Version der Antwort von il_guru .
Erweiterung:
Nullable:
Verwendung:
quelle
Die Frage ist: Wie definieren Sie, ob eine Woche 2012 oder 2013 ist? Ihre Vermutung ist, dass diese Woche als die erste Woche des Jahres 2013 markiert werden sollte, da 6 Tage der Woche im Jahr 2013 sind.
Ich bin mir nicht sicher, ob dies der richtige Weg ist. Diese Woche begann am Jahr 2012 (am Montag, den 31. Dezember), daher sollte sie als letzte Woche des Jahres 2012 markiert sein, daher sollte es die 53. Woche des Jahres 2012 sein. Die erste Woche des Jahres 2013 sollte am Montag, den 7. Dezember beginnen.
Jetzt können Sie den speziellen Fall von Randwochen (erste und letzte Woche des Jahres) anhand der Informationen zum Wochentag behandeln. Es hängt alles von Ihrer Logik ab.
quelle
quelle
Basierend auf der Antwort von il_guru habe ich diese Version für meine eigenen Bedürfnisse erstellt, die auch die Jahreskomponente zurückgibt.
quelle
Diese beiden Methoden werden helfen, vorausgesetzt, unsere Woche beginnt am Montag
quelle
Ein Jahr hat 52 Wochen und 1 Tag oder 2 im Falle eines Rundenjahres (52 x 7 = 364). 2012-12-31 wäre Woche 53, eine Woche, die nur 2 Tage haben würde, weil 2012 ein Rundenjahr ist.
quelle
quelle