Differenz zwischen zwei Zeiten

  • VB.NET

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

    Differenz zwischen zwei Zeiten

    Hallo Zusammen
    Ich habe ein völlig simples Problem, komme aber selbst nicht auf die Lösung.
    Es sind zwei Textboxen auf der Form mit unterschiedlichen Zeiten drin (Format LongTime), nun möchte ich unten in einem Label die Differenz zwischen den beiden Zeiten ausgeben lassen in einem normalen Format hh.mm.ss

    Ich kriege nur die Differenz nicht hin.
    So hätte ich jetzt mal gemacht (gibt bestimmt noch ne bessere möglichkeit, aber was solls)


    Solang die Zeit in der ersten TextBox größer als die der 2ten ist funktionierts eig ganz super, nur halt andersrum nicht :D musst also noch was verändern

    VB.NET-Quellcode

    1. Dim Time1() As String
    2. Dim Time2() As String
    3. Dim Erg(2) As Integer
    4. Time1 = Split(TextBox1.Text, ".") 'bzw ":", aber du hast "." in deinem Post als trennzeichen angegegeben
    5. Time2 = Split(TextBox2.Text, ".")
    6. Erg(0) = CInt(Time1(0)) - CInt(Time2(0))
    7. Erg(1) = CInt(Time1(1)) - CInt(Time2(1))
    8. If CInt(Time1(1)) < CInt(Time2(1)) Then
    9. Erg(0) -= 1
    10. Erg(1) = 60 + Erg(1)
    11. End If
    12. Erg(2) = CInt(Time1(2)) - CInt(Time2(2))
    13. If CInt(Time1(2)) < CInt(Time2(2)) Then
    14. Erg(1) -= 1
    15. Erg(2) = 60 + Erg(2)
    16. End If
    17. Label1.Text = Erg(0) & "." & Erg(1) & "." & Erg(2)
    Hallo Zusammen
    Besten Dank für den Tipp.
    Kann mir noch jemand sagen wie ich Stunden am besten addiere? Ich habe es schon mit DateAdd und "+" versucht, jedoch nicht das gewünschte Ergebnis bekommen.

    Folgendes:
    Textbox1 hat z.B. die Zeit 08:00
    Textbox2 hat z.B. die Zeit 12:00
    Die Differenz beträgt 04:00

    Nun habe ich verschiedene solche Ergebnisse, 04:00, 03:56, 02:12 und möchte diese zusammenzählen, dass ich (Format XX:XX) als Ergebnis habe.
    Hat jemand eine Idee?

    Gruss
    reustli
    Das funktioniert leider nicht so ganz. Nochmals detaillierter mein Problem:
    Ich habe verschiedene Stunden / Minutenwerte immer im Format XX:XX, zum Beispiel 04:23, 06:56, 03:22, also das sind keine Zeiten sondern Stunden und Minuten.
    So simpel es sein mag, ich muss diese Werte einfach addieren und ein Resultat bilden. Ich denke, die Schwierigkeit liegt darin, dass wenn die Minuten 60 übersteigen, dann eine weitere Stunde zu den Stunden hinzugezählt werden muss.

    Wie kann ich das lösen?
    Besten Dank für Eure Hilfe.

    Gruss
    reustli
    Hey,

    dieser Code müsste funktionieren:

    VB.NET-Quellcode

    1. Dim ausgangs_zeit As DateTime = CDate(("1:05"))
    2. Dim resultat_zeit As DateTime
    3. Dim spanne As New TimeSpan(1, 75, 0) ' Zeitspanne hh,mm,ss
    4. resultat_zeit = ausgangs_zeit.Add(spanne) ' Zeitspanne hinzufügen
    5. MsgBox(resultat_zeit.ToShortTimeString) ' Ausgabe im Format hh:mm

    Gruß, Manschula
    Hallo Manschula
    Besten Dank für deine Antwort. Funktioniert leider nicht ganz. Fakt ist, ich kann im Code keine fixe Zeit eingeben. Anbei noch die Projektmappe, ich denke es geht einfacher so, dann kannst du dir das mal anschauen.
    Im Feld rechts neben Kommen gehen wird die Differenz eingetragen zwischen Textbox1 und Textbox2, dann zum Testen kannst du in Textbox3 ein Stunden / Minutenwert eingeben. Wenn man auf Tagesabschluss klickt, sollte demzufolge Textbox16 und Textbox3 zusammengezählt werden.Zeitterminal.zip
    Hey,

    leider habe ich nur VB2005 installiert - kann deine Projekt also nur im Code sehen. Eine fixe Zeit musst du auch gar nicht angeben; die Ausgangszeit lässt sich auch über eine Textbox angeben:

    VB.NET-Quellcode

    1. Dim ausgangs_zeit As DateTime = CDate(TextBox1.Text)

    Meintest du das?

    Gruß, Manschula
    Hey,

    CTime? Ich und mein Visual Studio kennen nur CDate und das führt nicht zum gewünschten Ergebnis. Allerdings klappt es, wenn man die Eingabe in Textbox3 splittet. Folgender Code funktioniert, wenngleich er noch Optimierungsbedarf hat (Fehlerbehandlung, etc.):

    VB.NET-Quellcode

    1. ' Ausgangszeit steht in Textbox16 (Format hh:mm)
    2. Dim ausgangs_zeit As DateTime = CDate(TextBox16.Text)
    3. ' In Textbox3 steht die Zeitspanne, die hinzu-addiert werden soll (Format hh:mm)
    4. Dim spanne_part() As String = TextBox3.Text.Split(CChar(":"))
    5. ' Textbox3 wird an ":" gesplittet und addiert; Sekunden sind immer 0 (Aufgabenstellung)
    6. Dim spanne As New TimeSpan(CInt(spanne_part(0)), CInt(spanne_part(1)), 0)
    7. Dim ergebnis_zeit As DateTime = ausgangs_zeit.Add(spanne)
    8. ' Ausgabe in Msgbox; Format ggfs. anpassen
    9. MsgBox(ergebnis_zeit.ToShortTimeString)

    Gruß, Manschula
    Hallo Manschula
    Tip Top, das funktioniert schon mal gut. Was ich befürchtet habe hat sich bestätigt, wenn ich 15:06 (Stunden / Minuten) und 09:09 (Stunden / Minuten) addiere bekomme ich 00:15 als Ergebnis, das stimmt natürlich nicht, da die zwei zu addierenden Werte keine Zeiten sind sondern Stunden und Minuten. Korrekt wäre das Ergebnis 24:15

    Wir sind aber nahe dran ... hast du noch eine Idee?

    Gruss und besten Dank vorerst.
    Versuchen wir es mal ganz anders:

    VB.NET-Quellcode

    1. Dim Times1() As String = Split(TextBox3.Text,":") 'Zeit Nr.1
    2. Dim Times2() As String = Split(TextBox4.Text,":") 'Zeit Nr.2
    3. Dim Minutes As Integer = (CInt(Times1(1)) + CInt(Times2(1))) Mod 60
    4. Dim Hours As Integer = CInt(Times1(0)) + CInt(Times2(0)) + (CInt(Times1(1)) + CInt(Times2(1))) \ 60


    Manuelle Rechnung, sozusagen XD
    Hallo Fatheone
    Absolut Spitze! Funktioniert nun wie gewünscht. Die Schwierigkeit liegt darin, dass es keine Zeiten sind, sondern Stunden / Minuten Werte, das heisst 24 Stunden müssen überschritten werden können.

    Vielen Dank an alle die sich an dieser Aufgabenstellung beteiligt haben.

    Gruss
    reustli
    Der Trick sind die Operanden "Mod" und "\" (Div)
    Das erste gibt den Rest bei einer division der Minuten dur 60 zurück, d.h. der Maximale Wert ist 60-1 = 59
    und Mit "\" wird eine Ganzzahldivision durchgeführt, die Sagt, wieviel mal 60 in die Zahl Passt also wieviele Stunden vollendet sind.
    Die Stundenwerte müssen nun nur noch hinzuaddiert werden, fertig.
    Bei tagen muss die Formel für Hours noch "mod 24" gerechnet werden und Bei den Tagen "\ 24" addiert werden.

    Hast du das Prinzip versanden?


    VB.NET-Quellcode

    1. 'Format: YY:DD:HH:MM
    2. Public Class Times
    3. Public Minutes As Long
    4. Public Hours As Long
    5. Public Days As Long
    6. Public Years As Long
    7. Public Sub Flatten(FlatMins As Boolean, FlatHrs As Boolean, FlatDays As Boolean)
    8. Dim Temp As Integer = 0
    9. If FlatMins Then
    10. Temp = Minutes
    11. Minutes = Temp Mod 60
    12. Hours += Temp \ 60
    13. End If
    14. If FlatHours Then
    15. Temp = Hours
    16. Hours = Temp Mod 24
    17. Days += Temp \ 24
    18. End If
    19. If FlatDays Then
    20. Temp = Days
    21. Days = Temp Mod 365
    22. Years += Days \ 365
    23. End If
    24. End Sub
    25. End Class


    Diese Klasse Muss nur die Werte übergeben bekommen:
    s.o.

    VB.NET-Quellcode

    1. Dim TestZeit As Times
    2. TestZeit.Hours = Times1(0) + Times2(0)
    3. TestZeit.Minutes = Times1(1) + Times2(1)
    4. TestZeit.Flatten(True,False,False)


    Natürlich kann man noch Sekunden, Millisekunden, Jahrzehnte, Jahrhunderte, Millenien etc. einbauen.