Wie kann ich die DateTime für den Wochenbeginn erhalten?

469

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);
GateKiller
quelle

Antworten:

746

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);
Kompilieren Sie dies
quelle
15
Sie können dies wie folgt vereinfachen: int diff = dayOfWeek - dt.DayOfWeek; return dt.AddDays(diff).Date;
Troy
13
Troy, ich glaube nicht, dass Ihr Code funktioniert, wenn das angegebene Datum ein Sonntag ist und Ihr Wochenbeginn Montag ist. Es wird zurückkehren (Sonntag + 1) statt (Sonntag - 6)
Aaron Hoffman
1
Das funktioniert nicht , wenn dtUTC und ist bereits der Anfang der Woche zum Beispiel , 2012-09-02 16:00:00Zdie ist Mon, 03 Sep 2012 00:00:00in der Ortszeit angegeben. Es muss also auf dtOrtszeit umgestellt oder etwas schlauer gemacht werden. Es müsste auch das Ergebnis als UTC zurückgeben, wenn die Eingabe UTC wäre.
Reihe1
1
@ row1 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 Sie DateTime.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.
Rawling
1
Dies würde für mich manchmal um einen Tag verschoben sein. Es hat bei mir funktioniert, als ich die Zeitkomponente entfernt habe dt. Ich benutzteint diff = dt.Date.DayOfWeek - startOfWeek;
Vincent Saelzler
80

Der schnellste Weg, den ich finden kann, ist:

var sunday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek);

Wenn Sie möchten, dass ein anderer Wochentag Ihr Startdatum ist, müssen Sie nur den DayOfWeek-Wert am Ende hinzufügen

var monday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Monday);

var tuesday = DateTime.Today.AddDays(-(int)DateTime.Today.DayOfWeek + (int)DayOfWeek.Tuesday); 
Eric
quelle
2
Die einfachsten Antworten sind die besten, diese hat gut funktioniert, aber die Kultur hing davon ab
Cerveser
7
In Lettland beginnt die Woche am Montag .. Eigentlich .. Ich frage mich immer, wie eine Woche am Sonntag beginnen kann .. scheint mir unangenehm ..;)
0xDEAD BEEF
Diese Lösung ist gut. Darüber hinaus können Sie den Wochenstart jeden Tag festlegen, indem Sie den DayOfWeek hinzufügen, mit dem Sie beginnen möchten. var sunday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek); var monday = DateTime.Today.AddDays (- (int) DateTime.Today.DayOfWeek + (int) DayOfWeek.Monday);
Loligans
7
Dieser hinzugefügte Code funktioniert nicht für die von Threezol beschriebene Situation. Wenn der Wochenbeginn Montag sein soll, gibt Ihnen die Berechnung am Sonntag den kommenden Montag und nicht den vorherigen.
Giovanni B
4
Ja .. Für Sonntag gibt es den nächsten Modnay .. nicht den vorherigen: P
Ajay Aradhya
64

Etwas ausführlicher und kulturbewusster:

System.Globalization.CultureInfo ci = 
    System.Threading.Thread.CurrentThread.CurrentCulture;
DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
DayOfWeek today = DateTime.Now.DayOfWeek;
DateTime sow = DateTime.Now.AddDays(-(today - fdow)).Date;
Jason Navarrete
quelle
4
habe einen Fehler damit bekommen: heute = SONNTAG; fdow = MONTAG; (heute - fdow) == -1; DateTime.Now.AddDays (- (- 1)). Date == DateTime.Now.AddDays (+1) .Date; 01-02-2010! = 25-01-2010 !!
Balexandre
3
Wenn Sie dies an einem Sonntag versuchen, werden AddDays (0 - 1) für en-GB ausgeführt. Also braucht es @ Sarcastics if-Anweisung
Chris S
3
Sie können die aktuelle Kultur auch verwenden, CultureInfo.CurrentCultureindem Sie sie nicht so vom Faden abziehen. Scheint eine seltsame Art zu sein, darauf zuzugreifen.
Hank
7
Ein weiteres Problem: Es ist gefährlich, die NowUnterkunft 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.
Jeppe Stig Nielsen
1
Was diese Antwort tatsächlich bewirkt, ist Folgendes: "Suchen Sie innerhalb der aktuellen .NET-Woche (beginnend am Sonntag und endend am Samstag gemäß der Nummerierung der DayOfWeek-Aufzählung) den Tag der .NET-Woche, der der erste der Woche ist in der aktuellen Kultur ". Dies ist wahrscheinlich nicht das, was Sie wollen.
Mathieu Renda
36

Verwenden von Fluent DateTime :

var monday = DateTime.Now.Previous(DayOfWeek.Monday);
var sunday = DateTime.Now.Previous(DayOfWeek.Sunday);
Simon
quelle
29
Ich würde es hassen, nur dafür eine Abhängigkeit anzunehmen. "Kenne deine Abhängigkeiten und töte sie" scheint mir in den Sinn zu kommen. :)
Esteban Araya
7
Hat jemand bemerkt, wie "Fluent" funktioniert? Schauen Sie sich einfach den Code an. Es wird eine do ... while-Schleife verwendet. Ich möchte es nicht nennen, aber wenn ich mich dazu entscheide, wird es nicht angenehm sein. public static DateTime Previous(this DateTime start, DayOfWeek day) { do { start = start.PreviousDay(); } while (start.DayOfWeek != day); return start; }
Nsimeonov
10
@nsimeonov es ist Open Source. Bitte zögern Sie nicht, eine bessere Implementierung bereitzustellen, anstatt Steine ​​zu werfen.
Simon
12
Ja, als ob ich die ganze Zeit auf der Welt hätte, um jeden einzelnen Fehler in jeder Open-Source-Software der Welt zu beheben ...
nsimeonov
4
Ich musste einen Kommentar abgeben, weil ich über die Beschwerde über die Verwendung einer "do ... while" -Schleife ein großes Lachen bekam! Urkomisch! Ich habe noch nie einen anderen Programmierer über eine Schleife schaudern hören. Würde gerne das Gesicht dieses Clowns sehen, wenn er jemals merkt, woraus sein Code tatsächlich besteht.
Josh Stodola
22

Hässlich, aber es gibt zumindest die richtigen Daten zurück

Mit vom System eingestellter Wochenbeginn:

    public static DateTime FirstDateInWeek(this DateTime dt)
    {
        while (dt.DayOfWeek != System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
            dt = dt.AddDays(-1);
        return dt;
    }

Ohne:

    public static DateTime FirstDateInWeek(this DateTime dt, DayOfWeek weekStartDay)
    {
        while (dt.DayOfWeek != weekStartDay)
            dt = dt.AddDays(-1);
        return dt;
    }
Janspeed
quelle
3
Dies verdient wirklich mehr Stimmen für seine Einfachheit und Lesbarkeit.
ProfK
Diese Ressource hat auch geholfen: markb.uk/… (Wenn Sie den ersten / letzten Tag einer Woche oder eines Monats erhalten möchten).
FranzHuber23
13

Kombinieren wir die kultursichere Antwort und die Antwort auf die Erweiterungsmethode:

public static class DateTimeExtensions
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        DayOfWeek fdow = ci.DateTimeFormat.FirstDayOfWeek;
        return DateTime.Today.AddDays(-(DateTime.Today.DayOfWeek- fdow));
    }
}
Joel Coehoorn
quelle
12
Weder dt noch startOfWeek werden in Ihrer Funktion verwendet. Ich denke, die erste sollte anstelle von DateTime verwendet werden. Heute
hultqvist
2
Der Kontext der Frage besteht darin, dass eine zusätzliche Eigenschaft außerhalb von Datetime auf dieselbe Weise wie .Today oder .Now verwendet werden soll. Ich bin damit einverstanden, dass dies umständlich ist, aber es wurde darum gebeten.
Joel Coehoorn
7
Ich weiß, dass dies eine alte Antwort ist, aber sie ist auf so vielen Ebenen falsch. Zusätzlich zum vollständigen Ignorieren der Methodenargumente wird die Mathematik in vielen Fällen dazu führen, dass ein zukünftiges Datum ausgewählt wird. Dies sollte geschrieben wurde , zu verwenden , dtstatt DateTime.Today, die Mathematik in einem wickelt (offset + 7) % 7einen negativen Offset zu gewährleisten, eine Single-Parameter - Methode zu verwenden , Überlast , die verstreicht , die aktuelle Kultur ist FirstDayOfWeekals startOfWeekArgument 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.
Aaronaught
10

Dies würde Ihnen den vorhergehenden Sonntag geben (glaube ich):

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, 0, 0, 0);
Skizz
quelle
9

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: -

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
dayOfWeek = dayOfWeek == 0 ? 7 : dayOfWeek;
DateTime startOfWeek = now.AddDays(1 - (int)now.DayOfWeek);

Der Code für den vorherigen Sonntag ist einfacher, da wir diese Anpassung nicht vornehmen müssen: -

DateTime now = DateTime.Now;
int dayOfWeek = (int)now.DayOfWeek;
DateTime startOfWeek = now.AddDays(-(int)now.DayOfWeek);
ljs
quelle
9

Für Montag

DateTime startAtMonday = DateTime.Now.AddDays(DayOfWeek.Monday - DateTime.Now.DayOfWeek);

Für Sonntag

DateTime startAtSunday = DateTime.Now.AddDays(DayOfWeek.Sunday- DateTime.Now.DayOfWeek);
George Stavrou
quelle
1
Ich hatte einen anderen Anwendungsbedarf, aber ich habe diesen verwendet, um mich zum Laufen zu bringen. Ich mag es, weil es das einfachste ist, ohne Gießen - die Operationen in den gleichen / geeigneten Typen zu halten.
Qxotk
1
Dies funktioniert nicht, wenn der Tag Sonntag ist. Es gibt den folgenden Montag, nicht den Beginn der aktuellen Woche.
Grant J
Haben Sie auch den Sonntag oder den Montag kopiert? Ich habe 2 Antworten Eine, wenn Sie für Montag wollen und 2on, wenn Sie für Sonntag wollen ..... Ich habe es gerade getestet und es funktioniert gut für mich. DateTime.Now.DayOfWeek; Sonntag und Ergebnis DateTime.Now.AddDays (DayOfWeek.Sunday - DateTime.Now.DayOfWeek); {10/11/2019 4:14:55 μμ} Datum: {10/11/2019 12:00:00 πμ} Tag: 10 Tag der Woche: Sonntag Tag des Jahres: 314 Stunde: 16 Art: Lokale Millisekunde: 172 Minute: 14 Monate : 11 Sekunde: 55 Ticks: 637089992951723516 TimeOfDay: {16: 14: 55.1723516} Jahr: 2019
George Stavrou
@GrantJ Welche Linie hast du genommen ??? Ich habe gerade getestet und es funktioniert gut.
George Stavrou
Ich habe den ersten ausprobiert und Ihr DateTime.Now durch ein DateTime ersetzt, das den Sonntag, den 10. November 2019 darstellt. Es sollte Montag, den 4. November 2019 geben, aber es gibt Montag, den 11. November 2019. Ich habe hier eine Geige eingerichtet, die dies demonstriert: dotnetfiddle.net/ Jw3ZiO
Grant J
5
using System;
using System.Globalization;

namespace MySpace
{
    public static class DateTimeExtention
    {
        // ToDo: Need to provide culturaly neutral versions.

        public static DateTime GetStartOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.Subtract(TimeSpan.FromDays((int)dt.DayOfWeek));
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 0, 0, 0, 0);
        }

        public static DateTime GetEndOfWeek(this DateTime dt)
        {
            DateTime ndt = dt.GetStartOfWeek().AddDays(6);
            return new DateTime(ndt.Year, ndt.Month, ndt.Day, 23, 59, 59, 999);
        }

        public static DateTime GetStartOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetStartOfWeek();
        }

        public static DateTime GetEndOfWeek(this DateTime dt, int year, int week)
        {
            DateTime dayInWeek = new DateTime(year, 1, 1).AddDays((week - 1) * 7);
            return dayInWeek.GetEndOfWeek();
        }
    }
}
Braunbär
quelle
3
Zunächst einmal willkommen in der Community :) Es gibt bereits mehrere qualitativ hochwertige Antworten auf diese Frage, von denen die meisten vor sieben Jahren veröffentlicht wurden, als die Frage gestellt wurde. Während es eine lohnende Übung sein kann, zu versuchen, einfache Fragen wie diese zu beantworten, um Ihre Programmierfähigkeiten zu verbessern, fügt das Posten dieser Antwort in ihrem aktuellen Zustand der Frage nichts hinzu. Wenn Ihre Antwort etwas Neues enthält, nehmen Sie bitte ein paar Sätze, um zu erklären, wie es anders ist und warum es dadurch besser wird.
MTCoster
4

Alles zusammen mit der Globalisierung und die Angabe des ersten Wochentags als Teil unseres Aufrufs

public static DateTime StartOfWeek ( this DateTime dt, DayOfWeek? firstDayOfWeek )
{
    DayOfWeek fdow;

    if ( firstDayOfWeek.HasValue  )
    {
        fdow = firstDayOfWeek.Value;
    }
    else
    {
        System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
        fdow = ci.DateTimeFormat.FirstDayOfWeek;
    }

    int diff = dt.DayOfWeek - fdow;

    if ( diff < 0 )
    {
        diff += 7;
    }

    return dt.AddDays( -1 * diff ).Date;

}
Matthew Hintzen
quelle
4
var now = System.DateTime.Now;

var result = now.AddDays(-((now.DayOfWeek - System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.FirstDayOfWeek + 7) % 7)).Date;
Hallo Welt
quelle
2

Dies würde Ihnen am ersten Sonntag der Woche Mitternacht geben:

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek, t.Hour, t.Minute, t.Second);

Dies gibt Ihnen den ersten Montag um Mitternacht:

DateTime t = DateTime.Now;
t -= new TimeSpan ((int) t.DayOfWeek - 1, t.Hour, t.Minute, t.Second);
Glenn Slaven
quelle
2

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

DateTime firstDate = GetFirstDateOfWeek(DateTime.Parse("05/09/2012").Date,DayOfWeek.Sunday);
DateTime lastDate = GetLastDateOfWeek(DateTime.Parse("05/09/2012").Date, DayOfWeek.Saturday);

public static DateTime GetFirstDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime firstDayInWeek = dayInWeek.Date;
    while (firstDayInWeek.DayOfWeek != firstDay)
        firstDayInWeek = firstDayInWeek.AddDays(-1);

    return firstDayInWeek;
}
public static DateTime GetLastDateOfWeek(DateTime dayInWeek, DayOfWeek firstDay)
{
    DateTime lastDayInWeek = dayInWeek.Date;
    while (lastDayInWeek.DayOfWeek != firstDay)
        lastDayInWeek = lastDayInWeek.AddDays(1);

    return lastDayInWeek;
}
yeasir007
quelle
2

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:

int delta = DayOfWeek.Monday - DateTime.Now.DayOfWeek;
DateTime monday = DateTime.Now.AddDays(delta == 1 ? -6 : delta);
return monday;
Threezool
quelle
Es scheint, dass das Problem des "kommenden Montags" kulturabhängig ist (siehe auch Antwort von Eric und Kommentar von Cerveser). Wenn Sie jedoch die Sonntage nicht berücksichtigen müssen (wie bei üblichen Geschäftsterminen), kann Ihre Formel dies vereinfacht:dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek);
Damian Vogel
2

Schritt 1: Erstellen Sie eine statische Klasse

  public static class TIMEE
{
    public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(-1 * diff).Date;
    }
    public static DateTime EndOfWeek(this DateTime dt, DayOfWeek startOfWeek)
    {
        int diff = (7 - (dt.DayOfWeek - startOfWeek)) % 7;
        return dt.AddDays(1 * diff).Date;
    }
}

Schritt 2: Verwenden Sie diese Klasse, um sowohl den Start- als auch den Endtag der Woche zu erhalten

 DateTime dt =TIMEE.StartOfWeek(DateTime.Now ,DayOfWeek.Monday);
        DateTime dt1 = TIMEE.EndOfWeek(DateTime.Now, DayOfWeek.Sunday);
Muhammad Abbas
quelle
Ende der Woche (6 - (dt.DayOfWeek - startOfWeek)) % 7für mich gegen die von mir geschriebenen Unit-Tests erforderlich .
mlhDev
1

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:

private DateTime getStartOfWeek(bool useSunday)
{
    DateTime now = DateTime.Now;
    int dayOfWeek = (int)now.DayOfWeek;

    if(!useSunday)
        dayOfWeek--;

    if(dayOfWeek < 0)
    {// day of week is Sunday and we want to use Monday as the start of the week
    // Sunday is now the seventh day of the week
        dayOfWeek = 6;
    }

    return now.AddDays(-1 * (double)dayOfWeek);
}
Feuerfliege
quelle
1

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:

public static class DateTimeExtensions
{
    //http://stackoverflow.com/questions/38039/how-can-i-get-the-datetime-for-the-start-of-the-week
    //http://stackoverflow.com/questions/1788508/calculate-date-with-monday-as-dayofweek1
    public static DateTime StartOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return dt.AddDays(-1 * diff).Date;
    }

    public static int DayNoOfWeek(this DateTime dt)
    {
        //difference in days
        int diff = (int)dt.DayOfWeek - (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; //sunday=always0, monday=always1, etc.

        //As a result we need to have day 0,1,2,3,4,5,6 
        if (diff < 0)
        {
            diff += 7;
        }
        return diff + 1; //Make it 1..7
    }
}
user324365
quelle
1

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.

public static class DateTimeExtension
{
  public static DateTime GetFirstDayOfThisWeek(this DateTime d)
  {
    CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    var first = (int)ci.DateTimeFormat.FirstDayOfWeek;
    var current = (int)d.DayOfWeek;

    var result = first <= current ?
      d.AddDays(-1 * (current - first)) :
      d.AddDays(first - current - 7);

    return result;
  }
}

class Program
{
  static void Main()
  {
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine("Current culture set to en-US");
    RunTests();
    Console.WriteLine();
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("da-DK");
    Console.WriteLine("Current culture set to da-DK");
    RunTests();
    Console.ReadLine();
  }

  static void RunTests()
  {
    Console.WriteLine("Today {1}: {0}", DateTime.Today.Date.GetFirstDayOfThisWeek(), DateTime.Today.Date.ToString("yyyy-MM-dd"));
    Console.WriteLine("Saturday 2013-03-02: {0}", new DateTime(2013, 3, 2).GetFirstDayOfThisWeek());
    Console.WriteLine("Sunday 2013-03-03: {0}", new DateTime(2013, 3, 3).GetFirstDayOfThisWeek());
    Console.WriteLine("Monday 2013-03-04: {0}", new DateTime(2013, 3, 4).GetFirstDayOfThisWeek());
  }
}
Andreas Kromann
quelle
1

Modulo in C # funktioniert schlecht für -1mod7 (sollte 6 sein, c # gibt -1 zurück), also ... sieht die "Oneliner" -Lösung so aus :)

private static DateTime GetFirstDayOfWeek(DateTime date)
    {
        return date.AddDays(-(((int)date.DayOfWeek - 1) - (int)Math.Floor((double)((int)date.DayOfWeek - 1) / 7) * 7));
    }
Piotr Lewandowski
quelle
1

Gleiches gilt für das Ende der Woche (im Stil von @Compile Dies ist die Antwort):

    public static DateTime EndOfWeek(this DateTime dt)
    {
        int diff = 7 - (int)dt.DayOfWeek;

        diff = diff == 7 ? 0 : diff;

        DateTime eow = dt.AddDays(diff).Date;

        return new DateTime(eow.Year, eow.Month, eow.Day, 23, 59, 59, 999) { };
    }
FH
quelle
0

Sie können die ausgezeichnete Umbrella-Bibliothek verwenden :

using nVentive.Umbrella.Extensions.Calendar;
DateTime beginning = DateTime.Now.BeginningOfWeek();

Aber sie haben scheinen Montag als erster Tag der Woche gespeichert zu haben (siehe die EigenschaftnVentive.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:

// Or DateTime.Now.PreviousDay(DayOfWeek.Monday)
DateTime monday = DateTime.Now.PreviousMonday(); 
DateTime sunday = DateTime.Now.PreviousSunday();

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 :(.

Domenic
quelle
0

Dies gibt sowohl den Anfang der Woche als auch das Ende der Woche zurück:

    private string[] GetWeekRange(DateTime dateToCheck)
    {
        string[] result = new string[2];
        TimeSpan duration = new TimeSpan(0, 0, 0, 0); //One day 
        DateTime dateRangeBegin = dateToCheck;
        DateTime dateRangeEnd = DateTime.Today.Add(duration);

        dateRangeBegin = dateToCheck.AddDays(-(int)dateToCheck.DayOfWeek);
        dateRangeEnd = dateToCheck.AddDays(6 - (int)dateToCheck.DayOfWeek);

        result[0] = dateRangeBegin.Date.ToString();
        result[1] = dateRangeEnd.Date.ToString();
        return result;

    }

Ich habe den vollständigen Code zur Berechnung von Anfang / Ende von Woche, Monat, Quartal und Jahr in meinem Blog ZamirsBlog veröffentlicht

Zamir
quelle
0
    namespace DateTimeExample
    {
        using System;

        public static class DateTimeExtension
        {
            public static DateTime GetMonday(this DateTime time)
            {
                if (time.DayOfWeek != DayOfWeek.Monday)
                    return GetMonday(time.AddDays(-1)); //Recursive call

                return time;
            }
        }

        internal class Program
        {
            private static void Main()
            {
                Console.WriteLine(DateTime.Now.GetMonday());
                Console.ReadLine();
            }
        }
    } 
Denis
quelle
Können Sie Ihre Antwort um eine Erklärung Ihres Codes erweitern? Es hilft dem Leser mehr als Sie vielleicht denken.
gunr2171
Die Verwendung von Rekursion ist eine sehr schlechte Implementierung. Nur weil Sie Rekursionen verwenden könnten, heißt das nicht, dass Sie es sollten. Es wäre langsamer und speicherintensiver als andere hier bereitgestellte Lösungen.
Mikecamimo
0

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.

/// <summary>
/// Gets the date of the first day of the week for the date.
/// </summary>
/// <param name="date">The date to be used</param>
/// <param name="cultureInfo">If none is provided, the current culture is used</param>
/// <returns>The date of the beggining of the week based on the culture specifed</returns>
public static DateTime StartOfWeek(this DateTime date, CultureInfo cultureInfo=null) =>         
             date.AddDays(-1 * (7 + (date.DayOfWeek - (cultureInfo??CultureInfo.CurrentCulture).DateTimeFormat.FirstDayOfWeek)) % 7).Date;

Anwendungsbeispiel:

public static void TestFirstDayOfWeekExtension() {          
        DateTime date = DateTime.Now;
        foreach(System.Globalization.CultureInfo culture in CultureInfo.GetCultures(CultureTypes.UserCustomCulture | CultureTypes.SpecificCultures)) {
            Console.WriteLine($"{culture.EnglishName}: {date.ToShortDateString()} First Day of week: {date.StartOfWeek(culture).ToShortDateString()}");
        }
    }
Mike
quelle
0

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.

public static DateTime GetDateInCurrentWeek(this DateTime date, DayOfWeek day)
{
    var temp = date;
    var limit = (int)date.DayOfWeek;
    var returnDate = DateTime.MinValue;

    if (date.DayOfWeek == day) return date;

    for (int i = limit; i < 6; i++)
    {
        temp = temp.AddDays(1);

        if (day == temp.DayOfWeek)
        {
            returnDate = temp;
            break;
        }
    }
    if (returnDate == DateTime.MinValue)
    {
        for (int i = limit; i > -1; i++)
        {
            date = date.AddDays(-1);

            if (day == date.DayOfWeek)
            {
                returnDate = date;
                break;
            }
        }
    }
    return returnDate;
}
Ali Umair
quelle
0

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

var weekStartDate = DateTime.Now.AddDays(-((int)now.DayOfWeek - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek));
pixelda
quelle
0

Verwenden Sie nach Kompilieren dieser Antwort die folgende Methode, um das Datum für einen beliebigen Wochentag zu ermitteln:

public static DateTime GetDayOfWeek(this DateTime dt, DayOfWeek day)
{            
    int diff = (7 + (dt.DayOfWeek - DayOfWeek.Monday)) % 7;
    var monday = dt.AddDays(-1 * diff).Date;

    switch (day)
    {
        case DayOfWeek.Tuesday:
            return monday.AddDays(1).Date;

        case DayOfWeek.Wednesday:
            return monday.AddDays(2).Date;

        case DayOfWeek.Thursday:
            return monday.AddDays(3).Date;

        case DayOfWeek.Friday:
            return monday.AddDays(4).Date;

        case DayOfWeek.Saturday:
            return monday.AddDays(5).Date;

        case DayOfWeek.Sunday:
            return monday.AddDays(6).Date;
    }

    return monday;
}
Rowan Richards
quelle
0

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.

    DateTime WeekBeginning(DateTime input)
    {
        do
        {
            if (input.DayOfWeek.ToString() == "Monday")
                return input;
            else
                return WeekBeginning(input.AddDays(-1));
        } while (input.DayOfWeek.ToString() == "Monday");
    }
mihauuuu
quelle
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
David Buck
0

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 .

//Replace with whatever input date you want
DateTime inputDate = DateTime.Now;

//For this example, weeks start on Monday
int startOfWeek = (int)DayOfWeek.Monday;

//Calculate the number of days it has been since the start of the week
int daysSinceStartOfWeek = ((int)inputDate.DayOfWeek + 7 - startOfWeek) % 7;

DateTime previousStartOfWeek = inputDate.AddDays(-daysSinceStartOfWeek);
C. Keats
quelle