Wie finde ich den Beginn der Woche (sowohl Sonntag als auch Montag), wenn ich nur die aktuelle Zeit in C # kenne?
Etwas wie:
DateTime.Now.StartWeek(Monday);
Verwenden Sie eine Erweiterungsmethode. Sie sind die Antwort auf alles, wissen Sie! ;)
public static class DateTimeExtensions
{
public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
{
int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
return dt.AddDays(-1 * diff).Date;
}
}
Welches kann wie folgt verwendet werden:
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Monday);
DateTime dt = DateTime.Now.StartOfWeek(DayOfWeek.Sunday);
int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
dt
UTC und ist bereits der Anfang der Woche zum Beispiel ,2012-09-02 16:00:00Z
die istMon, 03 Sep 2012 00:00:00
in der Ortszeit angegeben. Es muss also aufdt
Ortszeit umgestellt oder etwas schlauer gemacht werden. Es müsste auch das Ergebnis als UTC zurückgeben, wenn die Eingabe UTC wäre.DateTime.Parse("2012-09-02 16:00:00Z")
gibt das Äquivalent zur Ortszeit zurück, und diese Methode gibt dieselbe Zeit korrekt als Ortszeit zurück. Wenn SieDateTime.Parse("2012-09-02 16:00:00Z").ToUniversalTime()
die UTC-Zeit explizit übergeben, gibt diese Methode 6 Tage, 16 Stunden früher, korrekt als UTC-Zeit zurück. Es funktioniert genau so, wie ich es erwartet hätte.dt
. Ich benutzteint diff = dt.Date.DayOfWeek - startOfWeek;
Der schnellste Weg, den ich finden kann, ist:
Wenn Sie möchten, dass ein anderer Wochentag Ihr Startdatum ist, müssen Sie nur den DayOfWeek-Wert am Ende hinzufügen
quelle
Etwas ausführlicher und kulturbewusster:
quelle
CultureInfo.CurrentCulture
indem Sie sie nicht so vom Faden abziehen. Scheint eine seltsame Art zu sein, darauf zuzugreifen.Now
Unterkunft zweimal anzurufen . Wenn die aktuelle Uhrzeit zwischen den beiden Anrufen 24:00 Uhr (oder Mitternacht 12:00 Uhr) vergeht, hat sich das Datum geändert.Verwenden von Fluent DateTime :
quelle
public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Hässlich, aber es gibt zumindest die richtigen Daten zurück
Mit vom System eingestellter Wochenbeginn:
Ohne:
quelle
Kombinieren wir die kultursichere Antwort und die Antwort auf die Erweiterungsmethode:
quelle
dt
stattDateTime.Today
, die Mathematik in einem wickelt(offset + 7) % 7
einen negativen Offset zu gewährleisten, eine Single-Parameter - Methode zu verwenden , Überlast , die verstreicht , die aktuelle Kultur istFirstDayOfWeek
alsstartOfWeek
Argument und möglicherweise (je nach Spezifikation) zu zwingen einem Null-Offset auf einen 7-Tage-Offset, sodass "letzter Dienstag" heute nicht zurückkehrt, wenn es bereits Dienstag ist.Dies würde Ihnen den vorhergehenden Sonntag geben (glaube ich):
quelle
Dies mag ein bisschen hacken, aber Sie können die .DayOfWeek-Eigenschaft in ein int umwandeln (es ist eine Aufzählung und da der zugrunde liegende Datentyp nicht geändert wurde, wird standardmäßig int verwendet) und damit den vorherigen Wochenbeginn bestimmen .
Es scheint, dass die in der DayOfWeek-Aufzählung angegebene Woche am Sonntag beginnt. Wenn wir also 1 von diesem Wert abziehen, entspricht dies der Anzahl der Tage, die der Montag vor dem aktuellen Datum liegt. Wir müssen auch den Sonntag (0) auf 7 abbilden, also wird bei 1 - 7 = -6 der Sonntag auf den vorherigen Montag abgebildet: -
Der Code für den vorherigen Sonntag ist einfacher, da wir diese Anpassung nicht vornehmen müssen: -
quelle
Für Montag
Für Sonntag
quelle
quelle
Alles zusammen mit der Globalisierung und die Angabe des ersten Wochentags als Teil unseres Aufrufs
quelle
quelle
Dies würde Ihnen am ersten Sonntag der Woche Mitternacht geben:
Dies gibt Ihnen den ersten Montag um Mitternacht:
quelle
Versuchen Sie dies in c #. Mit diesem Code können Sie sowohl das erste als auch das letzte Datum einer bestimmten Woche abrufen. Hier ist Sonntag der erste Tag und Samstag der letzte Tag, aber Sie können beide Tage entsprechend Ihrer Kultur einstellen
quelle
Versuchte mehrere, löste das Problem jedoch nicht mit einer Woche, die an einem Montag begann, was dazu führte, dass ich den kommenden Montag an einem Sonntag hatte. Also habe ich es ein bisschen modifiziert und es mit diesem Code zum Laufen gebracht:
quelle
dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Schritt 1: Erstellen Sie eine statische Klasse
Schritt 2: Verwenden Sie diese Klasse, um sowohl den Start- als auch den Endtag der Woche zu erhalten
quelle
(6 - (dt.DayOfWeek - startOfWeek)) % 7
für mich gegen die von mir geschriebenen Unit-Tests erforderlich .Die folgende Methode sollte die gewünschte DateTime zurückgeben. Pass in true für Sonntag als ersten Tag der Woche, false für Montag:
quelle
Danke für die Beispiele. Ich musste immer den ersten Tag der Woche "CurrentCulture" verwenden und für ein Array musste ich die genaue Tagesnummer kennen. Hier sind meine ersten Erweiterungen:
quelle
Niemand scheint dies noch richtig beantwortet zu haben. Ich werde meine Lösung hier einfügen, falls jemand sie benötigt. Der folgende Code funktioniert unabhängig davon, ob der erste Tag der Woche ein Montag oder ein Sonntag oder etwas anderes ist.
quelle
Modulo in C # funktioniert schlecht für -1mod7 (sollte 6 sein, c # gibt -1 zurück), also ... sieht die "Oneliner" -Lösung so aus :)
quelle
Gleiches gilt für das Ende der Woche (im Stil von @Compile Dies ist die Antwort):
quelle
Sie können die ausgezeichnete Umbrella-Bibliothek verwenden :
Aber sie haben scheinen Montag als erster Tag der Woche gespeichert zu haben (siehe die Eigenschaft
nVentive.Umbrella.Extensions.Calendar.DefaultDateTimeCalendarExtensions.WeekBeginsOn
), so dass frühere lokalisierte Lösung ein bisschen besser ist. Unglücklich.Bearbeiten : Bei näherer Betrachtung der Frage sieht es so aus, als würde Umbrella auch dafür funktionieren:
Obwohl es erwähnenswert ist, dass Sie sieben Tage zurück haben, wenn Sie an einem Montag nach dem vorherigen Montag fragen. Dies gilt aber auch, wenn Sie verwenden
BeginningOfWeek
, was wie ein Fehler scheint :(.quelle
Dies gibt sowohl den Anfang der Woche als auch das Ende der Woche zurück:
Ich habe den vollständigen Code zur Berechnung von Anfang / Ende von Woche, Monat, Quartal und Jahr in meinem Blog ZamirsBlog veröffentlicht
quelle
quelle
Hier ist eine Kombination einiger Antworten. Es wird eine Erweiterungsmethode verwendet, mit der die Kultur übergeben werden kann. Wenn eine nicht übergeben wird, wird die aktuelle Kultur verwendet. Dies gibt ihm maximale Flexibilität und Wiederverwendung.
Anwendungsbeispiel:
quelle
Wenn Sie Samstag oder Sonntag oder einen Wochentag möchten, aber die aktuelle Woche (Sa-So) nicht überschreiten, habe ich Sie mit diesem Code abgedeckt.
quelle
Wir mögen Einzeiler: Ermitteln Sie die Differenz zwischen dem ersten Wochentag der aktuellen Kultur und dem aktuellen Tag und subtrahieren Sie dann die Anzahl der Tage vom aktuellen Tag
quelle
Verwenden Sie nach Kompilieren dieser Antwort die folgende Methode, um das Datum für einen beliebigen Wochentag zu ermitteln:
quelle
Versuchen Sie, eine Funktion zu erstellen, die Rekursion verwendet. Ihr DateTime-Objekt ist eine Eingabe und die Funktion gibt ein neues DateTime-Objekt zurück, das für den Wochenanfang steht.
quelle
Wenn Sie auf diese Weise berechnen, können Sie auswählen, welcher Wochentag den Beginn einer neuen Woche anzeigt (in dem Beispiel, das ich Montag gewählt habe).
Beachten Sie, dass diese Berechnung für einen Tag, der ein Montag ist, den aktuellen Montag und nicht den vorherigen ergibt .
quelle