Datum und Uhrzeit vergleichen - Uhrzeit wird nicht mit verglichen

  • VB.NET

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

    Datum und Uhrzeit vergleichen - Uhrzeit wird nicht mit verglichen

    Hallo Leute,

    ich versuche mit Visual Basic einen Datumswert zu vergleichen. Leider erkennt das Programm nicht die Uhrzeit die in dem Datum erhalten ist.
    Wenn ich z.B ein Datum mit Uhrzeit vergleichen will (11.10.2019 10:00 > 11.10.2019 09:00) dann vergleicht das Programm die Uhrzeit nicht mit.


    VB.NET-Quellcode

    1. If (DateTime.Compare(Convert.ToDateTime(sDate), Convert.ToDateTime(reader("Von"))) = -1 Or DateTime.Compare(Convert.ToDateTime(sDate), Convert.ToDateTime(reader("Bis")))) = 1 And (DateTime.Compare(Convert.ToDateTime(eDate), Convert.ToDateTime(reader("Von"))) = -1 Or DateTime.Compare(Convert.ToDateTime(eDate), Convert.ToDateTime(reader("Bis"))) = 1) And Not (DateTime.Compare(Convert.ToDateTime(sDate), Convert.ToDateTime(reader("Von"))) = -1 And DateTime.Compare(Convert.ToDateTime(eDate), Convert.ToDateTime(reader("Bis"))) = 1) Then
    2. countBuchungen += 1
    3. End If


    Ich habe es mit Datetime.Compare versucht aber das hat nicht funktioniert. Er vergleicht die Uhrzeit einfach nicht mit

    Danke fürs lesen
    @vbTrainee2019 Schmeiß diesen Code weg, der ist nicht testbar.
    Mach Dir für jedes Element eine separate Variable und setz dann ein DateTime-Objekt aus diesen Elementen zusammen, das wird dann verglichen.
    Wenn es dann immer noch nicht stimmt, setz einen Haltepunkt drauf und überzeuge Dich, dass die Elemente richtig befüllt sind.
    Debuggen, Fehler finden und beseitigen
    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!
    Ich werfe noch ein funktionierendes Beipiel über den Zaun

    Nachtrag: Hab eben daraus noch schnell eine Form gebaut, mit 3 DateTimePicker. DtpTag.Format = Long, DtpVon / DtpBis.Format = Time (im Designer).

    VB.NET-Quellcode

    1. Private Sub BtnCompare_Click(sender As Object, e As EventArgs) Handles BtnCompare.Click
    2. Dim firstDate As DateTime = New DateTime(DtpTag.Value.Year, DtpTag.Value.Month, DtpTag.Value.Day, DtpVon.Value.Hour, DtpVon.Value.Minute, DtpVon.Value.Second)
    3. Dim secondDate As DateTime = New DateTime(DtpTag.Value.Year, DtpTag.Value.Month, DtpTag.Value.Day, DtpBis.Value.Hour, DtpBis.Value.Minute, DtpBis.Value.Second)
    4. Dim result As Integer = DateTime.Compare(firstDate, secondDate)
    5. If (result < 0) Then
    6. MessageBox.Show("First date is earlier")
    7. ElseIf (result = 0) Then
    8. MessageBox.Show("Both dates are same")
    9. Else
    10. MessageBox.Show("First date is later")
    11. End If
    12. End Sub

    Kapier ich grad nicht, @Dksksm.
    Warum nimmst Du den Tages-Dtp her, wenn er effektiv eh keine Rolle spielt?

    VB.NET-Quellcode

    1. Dim TimeDifferenceInSeconds = CInt((DtpVon.Value.TimeOfDay - DtpBis.Value.TimeOfDay).TotalSeconds)
    2. Select Case TimeDifferenceInSeconds
    3. Case < 0 : MessageBox.Show("von < bis")
    4. Case = 0 : MessageBox.Show("von = bis")
    5. Case > 0 : MessageBox.Show("von > bis")
    6. End Select

    Wenn ansonsten der Reader des TEs eine saubere Date(Time)-Instanz liefert, dann geht es doch einfacher:

    VB.NET-Quellcode

    1. Dim FirstTime = Date.Parse(reader("Von"))
    2. Dim SecondTime = Date.Parse(reader("Bis"))
    3. Dim TimeDifferenceInSeconds = CInt((FirstTime - SecondTime).TotalSeconds)
    4. 'und dann weiter wie oben

    ggf noch Datenquellen-Fehlerabfangen mit Date.TryParse statt Date.Parse

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich nehm dafür gern das Ticks

    VB.NET-Quellcode

    1. '#month/day/year houre:min:sec#
    2. Dim von As DateTime = #10/11/2019 10:00#
    3. Dim bis As DateTime = #10/11/2019 09:00#
    4. Dim res = von.Ticks - bis.Ticks
    5. Select Case res
    6. Case < 0 : Console.WriteLine("von < bis")
    7. Case = 0 : Console.WriteLine("von = bis")
    8. Case > 0 : Console.WriteLine("von > bis")
    9. End Select


    Freundliche Grüsse

    exc-jdbi
    Mit DateTimePicker-DefaultValues hast Du da aber keine Chance. Ich habe nicht umsonst gerundet. Wenn nämlich da nix geändert wird, werden die DTPs zu minimal unterschiedlichen Zeiten mit "Jetzt" gefüllt. Und schon ergibt sich eine Zeitdifferenz, die man auf Anhieb nicht sieht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @vbTrainee2019:
    Ich verstehe deinen Code nicht, und geb mir auch keine Mühe damit, weil als erstes sollteste den vereinfachen. Lade die Werte, mit denen du arbeitest, in geeignete Variablen, und benutze die, statt zig mal denselben Wert umständlich mit Convert.ToDateTime() auszurechnen:

    VB.NET-Quellcode

    1. dim dtCompare = Convert.ToDateTime(sDate)
    2. dim dtVon = Convert.ToDateTime(reader("Von"))
    3. dim dtBis = Convert.ToDateTime(reader("Bis"))
    4. If dtCompare >= dtVon AndAlso dtCompare <= dtBis Then countBuchungen += 1 ' meintest du das?
    Wenn dir dieser Post was bringt, lass es mich wissen - dein Code hat glaub noch mehr Verbesserungsbedarf.