Probleme bei der Berechnung, wenn der Wert über 24 Stunden liegt

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Murdock.

    Probleme bei der Berechnung, wenn der Wert über 24 Stunden liegt

    Hallo,

    ich bekomme es einfach nicht hin, das die Zeiten zusammen addiert werden.
    Wenn der Wert größer ist als 24 Stunden, fängt es wieder von neuem an.

    Zur Zeit ergibt 21:00 + 21:00 das Ergebnis 18:00 und nicht 42:00!

    Woran kann es liegen???

    VB.NET-Quellcode

    1. Dim mydateMo As Date = CDate(l111.Text)
    2. Dim mydateDi As Date = CDate(l112.Text)
    3. Dim mydateMi As Date = CDate(l113.Text)
    4. Dim mydateDo As Date = CDate(l114.Text)
    5. Dim mydateFr As Date = CDate(l115.Text)
    6. Dim mydateSa As Date = CDate(l116.Text)
    7. Dim mydateSo As Date = CDate(l117.Text)
    8. Dim tempdate As Date
    9. tempdate = mydateMo.Add(New TimeSpan(mydateDi.Ticks))
    10. tempdate = tempdate.Add(New TimeSpan(mydateMi.Ticks))
    11. tempdate = tempdate.Add(New TimeSpan(mydateDo.Ticks))
    12. tempdate = tempdate.Add(New TimeSpan(mydateFr.Ticks))
    13. tempdate = tempdate.Add(New TimeSpan(mydateSa.Ticks))
    14. tempdate = tempdate.Add(New TimeSpan(mydateSo.Ticks))
    15. Label11.Text = tempdate.ToString("HH:mm")


    MAtthias
    Ich möchte mehrere Stundenwerte addieren und anzeigen lassen!
    Dort kann es den wie oben beschrieben auch einen höheren Stundenwert als 24 Stunden geben.

    10:00 Stunden + 10:00 Stunden + 10:30 Stunden

    Dort soll das Ergebnis 30:30 Stunden angezeigt werden
    Ok!

    Ich habe es jetzt einmal so gemacht und komme zumindest schon mal über 24 Stunden.
    Problem machen jetzt nur die Minuten!

    21:00 Sunden + 21:33 Stunden ergibt auf einmal 43:-27 Stunden ???

    Rechne ich mit
    21:00 Stunden + 21:30 Stunden ergibt es das richtige Ergebnis 42:30 !!

    Hab ich jetzt vielleicht noch das Problem mit den Sekunden ????

    VB.NET-Quellcode

    1. Dim mydateMo As DateTime = CDate(l111.Text)
    2. Dim mydateDi As DateTime = CDate(l112.Text)
    3. Dim mydateMi As DateTime = CDate(l113.Text)
    4. Dim tempdate As TimeSpan
    5. tempdate = New TimeSpan(mydateMo.Ticks) + New TimeSpan(mydateDi.Ticks) + New TimeSpan(mydateMi.Ticks)
    6. Dim Hour As Integer = CInt(tempdate.TotalMinutes / 60)
    7. Dim Min As Integer = CInt(tempdate.TotalMinutes - (Hour * 60))
    8.  
    9. Label11.Text = (Hour.ToString("00") & ":" & Min.ToString("00"))
    Schau dir mal die TimeSpan-Struktur an. Schau dir mal den Unterschied von TimeSpan.Minutes und TimeSpan.TotalMinutes an.

    Anspielung auf die genauigkeit, wegen dem CInt()

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Murdock“ ()

    Genau wie us4711 schreibt.

    Aber warum nimmst du TotalMinutes und rechnest das in Stunden um? Was wenn totalMinutes/ 60 = 1.4 oder 1.6 sind? Dann kommt mit CInt() 1 oder 2 raus, was ja nicht korrekt ist. Lass dir die Stunden mit

    VB.NET-Quellcode

    1. Fix(t.TotalHours)

    ausgeben, durch Fix bekommst du den abgerundeten Wert, also ganze Stunden, nicht die angekratzten. Siehe meine Beispielausgabe oben.

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

    OK!

    Danke für die Infos.
    Habe jetzt so das richtige Ergebnis raus.
    Stellt sich nur die Frage für mich, ist das der richtige Weg oder ist er zu umständlich?

    VB.NET-Quellcode

    1. Dim mydateMo As DateTime = CDate(l111.Text)
    2. Dim mydateDi As DateTime = CDate(l112.Text)
    3. Dim mydateMi As DateTime = CDate(l113.Text)
    4. Dim tempdate As TimeSpan
    5. tempdate = New TimeSpan(mydateMo.Ticks) + New TimeSpan(mydateDi.Ticks) + New TimeSpan(mydateMi.Ticks)
    6. Dim Hour As Integer = CLng(Fix(tempdate.TotalHours))
    7. Dim Min As Integer = CLng(Fix(tempdate.TotalMinutes - (Hour * 60)))
    8. Label11.Text = (Hour.ToString("00") & ":" & Min.ToString("00"))

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

    @ErfinderDesRades

    Mit den ToString Überladungen kann man glaube ich nicht wie der TE möchte die Stunden ausgeben, wie z.B.

    VB.NET-Quellcode

    1. 100:00:00'h,m,s

    geht doch nur im Bereich -23 bis +23 oder?

    Nimm zm addieren die TimeSpan.Add Methode, wie schon gesagt wurde.

    VB.NET-Quellcode

    1. Dim t As New TimeSpan()
    2. t = t.Add(New TimeSpan(100, 10, 10))
    3. Debug.WriteLine("{0}:{1}:{2}", Fix(t.TotalHours), t.Minutes, t.Seconds)
    4. t = t.Add(New TimeSpan(0, 55, 10))
    5. Debug.WriteLine("{0}:{1}:{2}", Fix(t.TotalHours), t.Minutes, t.Seconds)
    6. t = t.Add(New TimeSpan(120, 99, 10))
    7. Debug.WriteLine("{0}:{1}:{2}", Fix(t.TotalHours), t.Minutes, t.Seconds)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Murdock“ ()

    Da du der Erfahrene bist und ich der Anfänger, würde ich
    deinen Tipps folgen.


    @ Murdock
    Danke
    Probiere ich Morgen aus!
    Euch noch einen schönen Abend!

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

    Das hab ich ja schon. Aber wenn ich jetzt Stunden größer als 23 bzw. kleiner als -23 ausgeben möchte, klappt das nicht. Klar kann man auch Tage ausgeben lassen. Verwende ich "%h\:mm\:ss" oder "hh\:mm\:ss" bei den Code von mir oben, bekomme ich 6, bzw. 06 für die Stunden, welche aber gesamt 222 sind. Wenn man also auf die Tage verzichten möchte, nur in H.M.S ausgeben möchte, muss man scheinbar doch String.Format nehmen.

    Murdock schrieb:

    größer als 23 bzw. kleiner als -23 ausgeben möchte, klappt das nicht

    Doch.
    TimeSpan.ToString-Methode (String)
    En bisken Eigeninitiative wär' nich' soooooooooooooooooooo schlecht ... :D

    Weil, unser Forum hier ist auch nicht so schlecht: Zeit Format mehr als 24 Stunden anzeigen.

    Dieser Link steht bei mir unten auf dieser Seite ...
    Hmm, ich glaube irgend versteh ich euch oder ihr mich nicht.
    Hier steht:

    "hh" Die Anzahl der Stunden im Zeitintervall, von 0 bis 23.

    msdn.microsoft.com/de-de/library/1ecy8h51(v=vs.110).aspx

    Ausgabe mit "hh\:mm\:ss": 06:44:30
    Mit String.Format: 222:44:30

    Nehm ich die ToString Überladungen geht die Ausgabe so nicht, wie mit String.Format. Oder liege ich tatsächlich falsch? So meine ich das. Die Tage kann man sich freilich ausgeben lassen, aber was wenn wie so gewollt?