In meiner VB-Anwendung können wir Berichte basierend auf verschiedenen vordefinierten Datumsbereichen wie "diese Woche" und "letzter Monat" ausführen. Ich möchte einen neuen Bereich für 'nächsten Monat' hinzufügen.

Es scheint, dass die vorhandenen Datumsbereiche, die wir definiert haben, anders codiert sind als die anderen Lösungen, die ich bisher gefunden habe. Ich habe auch Variationen ausprobiert, die meiner Meinung nach logisch waren und sich als richtig erweisen konnten. Leider ist es mir noch nicht gelungen.

Die definierten Bereiche, die wir derzeit in VB haben, sind wie folgt formatiert:

            Case 3 'This Week
            StartDate = Now.Date.AddDays(-Now.Date.DayOfWeek)
            EndDate = Now.Date.AddDays(6 - Now.Date.DayOfWeek)
        Case 4 'This Month
            StartDate = Now.Date.AddDays(-(Now.Day - 1))
            EndDate = New DateTime(Now.Year, Now.Month, Date.DaysInMonth(Now.Year, Now.Month))
1
STampa 17 Jän. 2019 im 19:18

3 Antworten

Beste Antwort

Nächsten Monat ist einfach:

Dim nexMonth = Date.Today.AddMonths(1)
StartDate = New Date(nexMonth.Year, nexMonth.Month, 1)
EndDate = StartDate.AddMonths(1).AddDays(-1) ' or like you did in Case4 but with nexMonth 
8
Tim Schmelter 17 Jän. 2019 im 16:21

Rango, Sie könnten ein Problem mit dieser Logik haben, wenn Today der 31. März ist, da der nächste Monat, April, nur 30 Tage hat. Aber die Lösung ist einfach:

Dim startOfThisMonth = New Date(Date.Today.Year, Date.Today.Month, 1)
Dim nextMonth = startOfThisMonth.AddMonths(1)

... und so weiter ...

Mit anderen Worten, berechnen Sie zuerst den ersten Tag des Monats, in dem Sie sich gerade befinden, und berechnen Sie dann Ihre Daten, wie Sie sie von diesem Tag und nicht von heute gezeigt haben.

(Und wenn Microsoft dies bereits so vorausgesehen hat, dass Ihre angebotene Lösung tatsächlich für jeden Tag korrekt ist, entschuldigen Sie mich bitte.)

-1
Mike Robinson 17 Jän. 2019 im 16:30

Einige gemeinsam genutzte Methoden FWIW

Public Class DateRanges
    Public Class DateRange
        Public StartDate As Date
        Public EndDate As Date
    End Class

    Public Shared Function ThisWeek(d As Date) As DateRange
        Dim rv As New DateRange
        rv.StartDate = d.AddDays(-d.DayOfWeek)
        rv.EndDate = rv.StartDate.AddDays(6)
        Return rv
    End Function

    Public Shared Function NextWeek(d As Date) As DateRange
        Dim rv As DateRange = ThisWeek(d)
        rv.StartDate = rv.StartDate.AddDays(7)
        rv.EndDate = rv.EndDate.AddDays(7)
        Return rv
    End Function

    Public Shared Function PreviousWeek(d As Date) As DateRange
        Dim rv As DateRange = ThisWeek(d)
        rv.StartDate = rv.StartDate.AddDays(-7)
        rv.EndDate = rv.EndDate.AddDays(-7)
        Return rv
    End Function

    Public Shared Function ThisMonth(d As Date) As DateRange
        Dim rv As New DateRange
        rv.StartDate = d.AddDays(-d.Day + 1)
        rv.EndDate = rv.StartDate.AddDays(Date.DaysInMonth(rv.StartDate.Year,
                                                           rv.StartDate.Month) - 1)
        Return rv
    End Function

    Public Shared Function NextMonth(d As Date) As DateRange
        Dim rv As DateRange = ThisMonth(d)
        rv.StartDate = rv.EndDate.AddDays(1)
        rv.EndDate = rv.StartDate.AddDays(Date.DaysInMonth(rv.StartDate.Year,
                                                           rv.StartDate.Month) - 1)
        Return rv
    End Function

    Public Shared Function PreviousMonth(d As Date) As DateRange
        Dim rv As DateRange = ThisMonth(d)
        rv.EndDate = rv.StartDate.AddDays(-1)
        rv.StartDate = rv.EndDate.AddDays(-Date.DaysInMonth(rv.EndDate.Year,
                                                            rv.EndDate.Month) + 1)
        Return rv
    End Function
End Class

Wie benutzt man

    Dim r As DateRanges.DateRange

    r = DateRanges.ThisWeek(Date.Now)
    r = DateRanges.NextWeek(#1/30/2019#)
    r = DateRanges.PreviousWeek(#1/30/2019#)
    r = DateRanges.ThisMonth(#1/30/2019#)
    r = DateRanges.NextMonth(r.StartDate)
    r = DateRanges.PreviousMonth(r.StartDate)
    r = DateRanges.NextMonth(Date.Now)
-1
dbasnett 17 Jän. 2019 im 17:15