Montag vor einem Datum als Datum

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    mit Date.DayOfWeek bekommst du eine Zahl, die den Wochentag eines Datums angibt.

    der montag vor einem Datum ist also

    VB.NET-Quellcode

    1. Dim dt = Date.Today
    2. Dim monday = dt.AddDays(DayOfWeek.Monday - dt.DayOfWeek)


    Ah - es ist komplizierter, weil man eine DayOfWeek-Umrechnung durchführen muß, die für Montag den niedrigsten Wert ergibt. Hier mein Test:

    VB.NET-Quellcode

    1. For i = 0 To 20
    2. Dim dt = Date.Today.AddDays(i)
    3. Dim dow = dt.DayOfWeek
    4. Dim monday = dt.AddDays(DayOfWeek.Monday - ((dt.DayOfWeek + 6) Mod 7) - 1)
    5. If monday.DayOfWeek = DayOfWeek.Monday AndAlso monday <= dt AndAlso monday.AddDays(7) > dt Then
    6. Stop
    7. Else
    8. Stop
    9. End If
    10. Next
    richtige Lösungen laufen den ersten Stop an, und im LokalFenster kannste die Richtigkeit der Lsg auch üprüfen

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

    Hey,

    ich würds so machen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim mondayBefore As Date = GetMondayBeforeDate(New Date(2012, 12, 24))
    4. MessageBox.Show(mondayBefore.ToShortDateString())
    5. End Sub
    6. Private Function GetMondayBeforeDate(ByVal theDate As Date) As Date
    7. Do
    8. theDate = theDate.Subtract(TimeSpan.FromDays(1))
    9. Loop Until theDate.DayOfWeek = 1
    10. Return theDate
    11. End Function
    12. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    nochma die Formel ordentlich in eine Function (und Test-Code):

    VB.NET-Quellcode

    1. Private Function AlignDate(ByVal dt As Date, ByVal alignTo As DayOfWeek) As Date
    2. Return dt.AddDays(-((dt.DayOfWeek + 7 - alignTo) Mod 7))
    3. End Function
    4. Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    5. For desiredAlign = DayOfWeek.Sunday To DayOfWeek.Saturday
    6. For i = 0 To 20
    7. Dim dt = Date.Today.AddDays(i)
    8. Dim dow = dt.DayOfWeek
    9. Dim AlignedDate = AlignDate(dt, desiredAlign)
    10. If AlignedDate.DayOfWeek = desiredAlign AndAlso AlignedDate <= dt AndAlso AlignedDate.AddDays(7) > dt Then
    11. Dim dumy = 9 'ggfs Haltepunkt zur Kontrolle im Lokalfenster
    12. Else
    13. Stop 'Test failed
    14. End If
    15. Next
    16. Next
    17. Stop 'Test succeeded
    Das habe ich aus einem meiner alten VBA-Projekte herauskopiert und in VB.NET umgewandelt...
    Ergibt sogar den Montag im alten Jahr...

    VB.NET-Quellcode

    1. Dim dat = WochenMo(Now)
    2. ...
    3. Function WochenMo(Datum As Date) As Date
    4. WochenMo = DateSerial(Datum.Year, Datum.Month, Datum.Day - Weekday(Datum, vbMonday) + 1)
    5. End Function

    VB.NET-Quellcode

    1. Function WochenMo(Datum As Date) As Date
    2. WochenMo = DateSerial(Datum.Year, Datum.Month, Datum.Day - Weekday(Datum, vbMonday) + 1)
    3. End Function
    Uff! - dann hast du ja einen Haufen Schrott aus den Vb6-Namespaces importiert:

    VB.NET-Quellcode

    1. Imports Microsoft.VisualBasic.Constants
    2. Imports Microsoft.VisualBasic.DateAndTime

    Ich habs weiter an .Net angepasst:

    VB.NET-Quellcode

    1. Function WochenMo(ByVal Datum As Date) As Date
    2. WochenMo = Datum.AddDays((-Weekday(Datum, vbMonday) + 1))
    3. End Function
    Knackpunkt ist halt die Weekday-Funktion, die's in .Net nicht mehr gibt.

    Das muß man selber ausrechnen, nach der Formel

    VB.NET-Quellcode

    1. (dt.DayOfWeek + 7 - DayOfWeek.Monday) Mod 7
    Ja, diese Rechnung ist bei mir ja verallgemeinert eingebaut:

    VB.NET-Quellcode

    1. Private Function AlignDate(ByVal dt As Date, ByVal alignTo As DayOfWeek) As Date
    2. Return dt.AddDays(-((dt.DayOfWeek + 7 - alignTo) Mod 7))
    3. End Function
    Und nun die grausigen Imports der vb6-Namespaces wieder wegmachen. ;)
    DateSerial und Weekday gehören also auch zu den bösen Funktionen, die habe ich aber dort nicht gefunden...
    Da war ich aber eh selbst auch skeptisch, weil es nur Wenig zum Umschreiben gab.
    Also bin ich noch stark VB6-lastig im coden - aber wieder etwas dazugelernt ;)
    @EDR: Danke für die Korrekturen