Datum von bestimmten Wochentagen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Kasi.

    Wenn ich jetzt nicht falsch liege(zu viel gearbeitet heute) dann so:

    C#-Quellcode

    1. DateTime dateTime = DateTime.Now;
    2. int daysToSkip = ((int)DayOfWeek.Tuesday - (int)dateTime.DayOfWeek + 7) % 7;
    3. DateTime nextTuesday = dateTime.AddDays(daysToSkip == 0 ? 7 : daysToSkip);
    4. //wenn der nächste freitag vom heutigen Tag an gemeint ist, dann dies:
    5. daysToSkip = ((int)DayOfWeek.Friday - (int)dateTime.DayOfWeek + 7) % 7;
    6. DateTime nextFridayA = dateTime.AddDays(daysToSkip == 0 ? 7 : daysToSkip);
    7. //wenn der nächste Freitag nach dem nächsten Dienstag dann:
    8. DateTime nextFridayB = nextTuesday.AddDays(3);

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ganz verkürzt und vereinfacht könnte man es so berechnen (in diesem Beispiel wird nach dem nächsten Sonntag gesucht):

    VB.NET-Quellcode

    1. Dim DofW As Integer = DayOfWeek.Sunday - Now.DayOfWeek
    2. If DofW <= 0 Then DofW = 7 + DofW
    3. Label1.Text = Now.AddDays(DofW).ToShortDateString

    Wenn der aktuelle Wochentag auch dazugezählt werden soll und nicht erst der in einer Woche angezeigt werden soll, dann in der IF-Zeile nur das Gleichzeichen entfernen: If DofW < 0 Then DofW = 7 + DofW


    Man kann daraus eine Funktion machen:

    VB.NET-Quellcode

    1. Public Function NaechstenWochentag_Suchen(Wochentag As Integer) As Date
    2. Dim DofW As Integer = Wochentag - Now.DayOfWeek
    3. If DofW <= 0 Then DofW = 7 + DofW
    4. Return Now.AddDays(DofW)
    5. End Function


    Den Funktionsaufruf dann entsprechend mit dem gesuchten Wochentag vollführen:

    VB.NET-Quellcode

    1. Label1.Text = NaechstenWochentag_Suchen(DayOfWeek.Sunday).ToShortDateString


    Die Suchtage kann sich auch als eigene Konstanten, Array, eine List, Dictionary mit Schlüssel etc. machen, um nicht immer mit dem DayOfWeek.xxx arbeiten zu müssen. Das Datum kann man auch noch mehr beschneiden oder sich in der Langversion ausgeben lassen und das z.B. auch gleich in der Rückgabezeile der Funktion einbauen; und als Rückgabetyp kann man auch DateTime verwenden. Beim Übergang exakt durch Mitternacht, wo dann der Wochentag wechselt, sollte man Vorsicht walten lassen, wenn man die Tage abfragen bzw. das Datum von diesen berechnen möchte - das spielt aber nur in besonderen Fällen eine Rolle.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „Gregor Jasinski“ ()

    TomTheCoder15 schrieb:

    Wie bekomme ich das hin

    Hier zwei kurzen Routinen (2 Überladungen ab aktueller Zeit oder mit Angabe eines beliebigen Datums):

    VB.NET-Quellcode

    1. Public Function MondayOfWeek() As Date
    2. Dim _time = DateTime.Now
    3. Return _time.AddDays(-((_time.DayOfWeek + 7 - DayOfWeek.Monday) Mod 7))
    4. End Function
    5. Public Function MondayOfWeek([Date] As Date) As Date
    6. Return [Date].AddDays(-(([Date].DayOfWeek + 7 - DayOfWeek.Monday) Mod 7))
    7. End Function
    ...auf Dienstag und auf Freitag brauchst du nur die entsprechenden fehlenden Tage dazuzählen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()

    Wenn tatsächlich diese Variante gesucht war oder besser zum Konzept passt, dann am besten die idiotensichere mit einem Zeitstempel verwenden, um das Mitternachtsproblem aus der Welt zu schaffen, was das zweimalige Abfragen von Now sonst implizieren würde:

    VB.NET-Quellcode

    1. Public Function NaechstenWochentag_Suchen(Wochentag As Integer) As Date
    2. Dim Jetzt As Date = Now
    3. Dim DofW As Integer = Wochentag - Jetzt.DayOfWeek
    4. If DofW <= 0 Then DofW = 7 + DofW
    5. Return Jetzt.AddDays(DofW)
    6. End Function


    Das Umdefinieren der Konstanten kann man sehr schlicht mit Const, ReadOnlny oder auch ohne diesen Schutzzusatz realisieren:

    VB.NET-Quellcode

    1. Public Const Montag As Integer = DayOfWeek.Monday
    2. Public ReadOnly Dienstag As Integer = DayOfWeek.Tuesday
    3. Public Mittwoch As Integer = DayOfWeek.Wednesday
    4. Public Donnerstag As Integer = DayOfWeek.Thursday
    5. Public Freitag As Integer = DayOfWeek.Friday
    6. Public Samstag As Integer = DayOfWeek.Saturday
    7. Public Sonntag As Integer = DayOfWeek.Sunday


    Ein Beispielaufruf, um den nächsten Sonntag zu suchen, wäre dann entsprchend schon auf Deutsch:

    Label1.Text = NaechstenWochentag_Suchen(Sonntag).ToShortDateString
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    @Gregor Jasinski Das geht sogar in englisch, und kürzer:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Label1.Text = NaechstenWochentag_Suchen(DayOfWeek.Sunday).ToShortDateString
    3. End Sub
    4. Public Function NaechstenWochentag_Suchen(Wochentag As DayOfWeek) As Date
    5. Dim Jetzt As Date = Now
    6. Dim DofW As Integer = Wochentag - Jetzt.DayOfWeek
    7. If DofW <= 0 Then DofW = 7 + DofW
    8. Return Jetzt.AddDays(DofW)
    9. End Function
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    (...) Das geht sogar in englisch, und kürzer (...)

    Das steht auch so in meinem Usrpungspost (Nr.3) - einfach mal hochscrollen und nachschauen, das Deutsche ist eine Erweiterung dessen - es steht jedem frei, es zu verwenden oder auch nicht zu verwenden. Darüberhinaus kann ich mir gut vorstellen, dass es wehtut, wenn an dem „goldenen Kalb” oder „Götzenbild”, welches Englisch in diesem Kontext heißt, gekratzt wird.
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.
    Hier vielleicht noch ergänzend zum Schluss eine Version, wo man sehen kann, wie man mit optionaler Parameterübergabe in eigenen Unterprogrammen und Funktionen in vb.NET arbeiten kann – ein sehr nützliches Feature. Wird der zweite Parameter weggelassen, wird auch der heutige Tag, z.B. Samstag, nicht gefunden, sondern der Samstag in einer Woche, da Heute_Inclusive dann automatisch zu False beim Einsprung in die Funktion wird; man könnte natürlich auch explizit False als zweiten Parameter ausformulieren und übergeben, aber genau das möchte man sich ja durch den Gebrauch von Optional sparen. True muss dagegen explizit eingegeben werden, damit auch der heutige Tag gefunden wird – man kann das selbstverständlich auch umdrehen und am Ende bei Optional =True schreiben, dann müsste man immer False explizit eingeben. Und noch etwas, der Name „DofW” der Hilfsvariable innerhalb der Funktion wurde einfach beim Schreiben als Abkürzung für DayOfWeek genommen, alle anderen Assoziationen kann man als zufällig betrachten, man sollte bei solchen Dingen kühlen Kopf bewahren und sich davon nicht in die Irre leiten lassen; ob es andererseits Zufälle und in welchem Umfang in dieser erschaffenen Realität gibt, die übrigens in der Planckwelt auch mit Bits und darüberhinaus u.a. mit Vektorgeometrie arbeitet, ist natürlich eine andere Frage, die nicht zu diesem Thema gehört.


    VB.NET-Quellcode

    1. Label1.Text = NaechstenWochentag_Suchen(Samstag).ToShortDateString
    2. Label1.Text = NaechstenWochentag_Suchen(Samstag, True).ToShortDateString


    VB.NET-Quellcode

    1. Public Function NaechstenWochentag_Suchen(Wochentag As Integer, Optional Heute_Inclusive As Boolean = False) As Date
    2. Dim Jetzt As Date = Now '.AddDays(+0) 'Add nur zum Testen
    3. Dim DofW As Integer = Wochentag - Jetzt.DayOfWeek
    4. '------------------------------
    5. If Heute_Inclusive = False Then
    6. If DofW <= 0 Then DofW = 7 + DofW 'schließt den heutigen Tag aus
    7. Else
    8. If DofW < 0 Then DofW = 7 + DofW 'schließt den heutigen Tag ein
    9. End If
    10. '------------------------------
    11. Return Jetzt.AddDays(DofW)
    12. End Function
    Das gleichzeitige Erscheinen von Dummheit und Unmündigkeit nach Immanuel Kant ist eines der schlimmsten Dinge, die einem Homo sapiens in geistiger Hinsicht widerfahren können, hat manchmal aber auch durchaus seine Vorteile.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gregor Jasinski“ ()

    @Gregor Jasinski

    du verwendest zwar DayOfWeek aber umständlich, warum nicht einfach eine List(of Date)

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'für 1 Jahr
    3. Dim startDate As New Date(2023, 1, 1)
    4. Dim endDate As New Date(2023, 12, 31)
    5. Dim dayCount As Integer = (endDate - startDate).Days + 1
    6. Dim datesListing As List(Of Date) = Enumerable.Range(0, dayCount).
    7. Select(Function(n) startDate.AddDays(n)).
    8. Where(Function(d) d.DayOfWeek = DayOfWeek.Tuesday OrElse
    9. d.DayOfWeek = DayOfWeek.Friday).
    10. ToList()
    11. ListBox3.DataSource = datesListing
    12. End Sub


    VB.NET-Quellcode

    1. 'Zeitraum 14 Tage vor und zurück
    2. Dim dateSelected As Date
    3. Dim TuesdayListing As New List(Of Date)
    4. Dim FridayListing As New List(Of Date)
    5. For i = -14 To 14
    6. dateSelected = Date.Today.AddDays(i)
    7. If dateSelected.DayOfWeek = DayOfWeek.Tuesday Then
    8. TuesdayListing.Add(dateSelected)
    9. End If
    10. If dateSelected.DayOfWeek = DayOfWeek.Friday Then
    11. FridayListing.Add(dateSelected)
    12. End If
    13. Next
    14. ListBox1.DataSource = TuesdayListing
    15. ListBox2.DataSource = FridayListing
    16. End Sub