DateTimePicker c# Tage berechnen

werner_sg

Erfahrenes Mitglied
Hallo zusammen

ich würde gerne die Anzahl der Tage zwischen zwei Daten berechnen, wobei es eigentlich nur noch hängt wenn ein Jahreswechsel besteht.

C#:
    Private Sub DateTimePicker3_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker3.ValueChanged
        Dim days As New Integer
        Dim days2 As New Integer
        Dim days3 As New Integer
        Dim days4 As New Integer

        days = DateTimePicker3.Value.DayOfYear - DateTimePicker1.Value.DayOfYear
        days2 = DateTimePicker3.Value.DayOfYear
        days3 = DateTimePicker1.Value.Day
        days4 = DateTimePicker3.Value.DayOfYear




        TxtAnzahlTage.Text = days.ToString()
        If Val(TxtAnzahlTage.Text) < 0 Then
            TxtAnzahlTage.Text = (31 -days3.ToString() + days4.ToString())
        End If

    End Sub

days funktioniert nur innerhalb eines Jahres, von Dezember 2021 auf Januar 2022 ergibt es 0.
in der if Abfrage konnte ich das Problem von Dezember auf die Monate des folge Jahres lösen, in dem ich einfach das Ergebnis von days3 von der Anzahl der Tage im Dezember (31) abziehe und dann die Tage des nächsten Jahres hinzufüge.

ist aber nur eine unbefriedigende Notlösung, da wenn das Startdatum vor Dezember liegt das ganze nicht mehr richtig berechnet wird
vom 28 September 2021 bis zum 18 Februar gibt es dann das gleiche Ergebnis wie vom 28 Dezember bis zum 18 Februar

Auch eine Variante mit 365 - days2 würde alle 4 Jahre einen fehler aufweisen wegen des Schaltjahres ;-)

Welche Lösung gibt es

Danke Werner
 

Zvoni

Erfahrenes Mitglied
Bin kein .NET-ler, aber ich wäre doch sehr überrascht, wenn es in C# keine DateDiff-Funktion gebe (wie ich es aus VBA kenne)


Aber ein Datum (Zeit) lässt sich immer auch als ein Integer (Double) repräsentieren bzw. der Typ DateTime müsste sowieso nur ein Alias/TypeDef für ein Double sein --> 64Bit-Gleitkomma
Nimm das Value des DTPickers, und zieh das eine vom anderen ab

Calculating Date Difference in C#
 

Spyke

Premium-User
einfach die DateTime Objekte subtrahieren
C#:
TimeSpan ts = DateTimePicker3.Value - DateTimePicker1.Value
dies gibt dir ein TimeSpan Objekt zurück und darüber hast du deine Tage
C#:
ts.TotalDays
 

werner_sg

Erfahrenes Mitglied
einfach die DateTime Objekte subtrahieren
C#:
TimeSpan ts = DateTimePicker3.Value - DateTimePicker1.Value
dies gibt dir ein TimeSpan Objekt zurück und darüber hast du deine Tage
C#:
ts.TotalDays

Hatte ich bereits versucht dabei erhalte ich die Meldung "Timespan ist ein Strukturtyp und kann nicht als Ausdruck verwendet werden"
 

werner_sg

Erfahrenes Mitglied
Bin kein .NET-ler, aber ich wäre doch sehr überrascht, wenn es in C# keine DateDiff-Funktion gebe (wie ich es aus VBA kenne)


Aber ein Datum (Zeit) lässt sich immer auch als ein Integer (Double) repräsentieren bzw. der Typ DateTime müsste sowieso nur ein Alias/TypeDef für ein Double sein --> 64Bit-Gleitkomma
Nimm das Value des DTPickers, und zieh das eine vom anderen ab

Calculating Date Difference in C#
funktioniert nur innerhalb eines Jahres bei Verwendung von DateTimePicker3.Value.DayOfYear darüberhinaus muss getrickst werden
 

Spyke

Premium-User
was machst du weiter mit dem TimeSpan?
an der Subtraktion und dem TimeSpan kanns eigentlich nicht liegen
 

werner_sg

Erfahrenes Mitglied
Huh?
Ergibt keinen Sinn für mich.
DTPicker.Value sollte ein DateTime sein
How can I convert a DateTime to an int?

Sollte also eine "ticks"-Eigenschaft haben. Die ticks von einander abziehen, und fertig.
für mich ja auch nicht

habs jetzt erst mal so

C#:
    Private Sub DateTimePicker1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker1.ValueChanged



        Dim days As New Integer
        Dim days2 As New Integer
        Dim days4 As New Integer

        days = DateTimePicker3.Value.DayOfYear - DateTimePicker1.Value.DayOfYear    'berechnet die Anzahl der Tage in einem Jahr
        days2 = DateTimePicker1.Value.DayOfYear                                     ' gibt den Tag des Jahres aus Startdatum
        days4 = DateTimePicker3.Value.DayOfYear                                     ' gibt den Tag des Jahres aus Enddatum




        TxtAnzahlTage.Text = days.ToString()
        If Val(TxtAnzahlTage.Text) < 0 Then                                         'funktioniert innerhalb eines Jahres
            TxtAnzahlTage.Text = (365 - days2.ToString() + days4.ToString())        ' Alternative bei Jahrewechsel wenn kein Schaltjahr
        End If

    End Sub

suche jetzt noch eine Lösung die Tage des ganzen Jahres aus Picker3 zu erhalten, dann könnte ich soweit diese dann 366 sind noch mit in die if Einbauen

Gruß Werner