Zeit addiered

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Zeit addiered

    Hallo
    Ich brauche eure hilfe.

    Wie kann mann mit der Zeit Rechnen, dies über 24 Stunden.

    1. im Texstbox gebe ich die Zahl 1200 dies müsste dann 12:00 stunden sein in der zweiter texstbox das gleiche ( 0030 = 00:30 min.)
    2. dann muss es adiert werden 12:00 stunden + 30 min. = 12:30 stunden und min.

    Besten Dank im Voraus

    MFG

    Dani

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Mit TimeSpan hast du alles was du brauchst.

    Ich kann dir nur empfehlen die Textboxes mit realen ganzzahligen Werten zu füllen.

    Die TextBoxes sind nur da zum die Zahlen darzustellen. Die Berechnung sollte im Hintergrund gemacht werden mit den entsprechenden Variablen.

    VB.NET-Quellcode

    1. Dim ts1 = New TimeSpan(CInt(Me.TbHoures.Text), 0, 0) 'Me.TbHoures.Text = 12.Tostring
    2. ts1 = ts1.Add(New TimeSpan(0, CInt(Me.TbMinutes.Text), 0)) 'Me.TbMinutes.Text = 30.tostring


    VB.NET-Quellcode

    1. Me.TbHoures.Text = ts1.Hours.ToString
    2. Me.TbMinutes.Text = ts1.Minutes.ToString


    So sollte es klappen für die Berechnungen.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „exc-jdbi“ ()

    kommt auch drauf an, was du machen willst.
    Als ich letztes Jahr eine kleine Zeiterfassung programmiert hab, fand ich TimeSpan ungeeignet, weil Formeln im typisierten Dataset können Zeitwerte nicht addieren.
    Daher habe ich Uhrzeiten und Zeitdauern innerhalb eines Tages im Dataset als Double deklariert, und zur Anzeige via Databinding eine selbstgebastelte Umformatierung ins Format "h:mm" zwischengeschaltet.

    Wie gesagt: Es kommt drauf an, was du machen willst.
    Hallo

    An alle vielen lieben Dank für eure Antworten. Ich muss es besser beschreieben.

    Ich habe variabel Kontrollzeit sowie Wegzeit , Korrekturzeit
    mit diesem Code bin ich besten bedient jedoch muss ich bei TextBox1 beispiel 08:00 eingeben ziel währe 0800 ohne doppelpunkte




    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Zahl1 As TimeSpan
    3. Dim Zahl2 As TimeSpan
    4. Dim Ergebnis As TimeSpan
    5. TimeSpan.TryParse(TextBox1.Text, Zahl1)
    6. TimeSpan.TryParse(TextBox2.Text, Zahl2)
    7. Ergebnis = Zahl1 _
    8. + Zahl2
    9. Label1.Text = Ergebnis.ToString()
    10. End Sub


    Noch mals vielen Dank


    Beste Grüsse

    * CodeTags eingefügt * ~NoFear23m
    Bilder
    • berehnung.PNG

      9,58 kB, 347×633, 61 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nofear23m“ ()

    tja, das geht mit .Parse nicht, sondern da musste selbst iwelche (nicht so ganz einfache) Logik schreiben.
    Und die Randbedingungen ganau definieren.
    Was soll passieren bei Eingabe von:
    1. "800"
    2. "8,00"
    3. "80"
    4. "8:50"
    5. "8,5"
    6. "85"
    7. "8.00"
    8. "8"
    9. "Acht"
    ??

    In meim Werk habich dafür diese Methode:

    VB.NET-Quellcode

    1. ''' <summary> liest aus sTime stunden und minuten, returnt die gesamt-stunden - bei ungültiger Eingabe 0.0. Minutentrenner sind beliebige Nicht-Ziffern, können sogar auch weggelassen werden </summary>
    2. Public Shared Function TimeString2Double(sTime As String) As Double
    3. If sTime.Length = 0 Then Return 0.0
    4. Dim chars = sTime.ToCharArray()
    5. Dim len = 3.Min(chars.Length)
    6. Dim isNegative = chars(0) = "-"c
    7. 'in den letzten 3 chars rückwärts nach einem Separator suchen
    8. Dim iSep = Array.FindLastIndex(chars, chars.Length - 1, len, Function(c) Not Char.IsDigit(c))
    9. If isNegative AndAlso iSep = 0 Then iSep = -1 ' ggfs. das Minus am Anfang ist natürlich kein Separator
    10. Dim minutes = 0.0
    11. 'Der Select liest (evtl.) die Minuten, und stellt dann iSep so ein, dass anschl. die Stunden gelesen wern können
    12. Select Case iSep
    13. Case Is < 0, chars.Length ' kein Separator gefunden
    14. chars = chars.Where(AddressOf Char.IsDigit).ToArray ' chars bereinigen von non-Digits
    15. If chars.Length < 3 Then iSep = chars.Length : Exit Select ' keine Minuten (nur s.u. Stunden)
    16. 'bei mehr als 2 ziffern die letzten beiden als Minute lesen
    17. len.Minimize(2)
    18. iSep = chars.Length - len
    19. minutes = Double.Parse(New String(chars, iSep, len))
    20. Case Else
    21. iSep += 1
    22. len = chars.Length - iSep
    23. If len > 0 Then minutes = Double.Parse(New String(chars, iSep, len)) ' ab iSep Minuten lesen
    24. chars = chars.Take(iSep - 1).Where(AddressOf Char.IsDigit).ToArray ' nur chars bis iSep übriglassen
    25. iSep = chars.Length
    26. End Select
    27. 'bis iSep als Stunden lesen
    28. Dim dbl = If(iSep = 0, 0, Double.Parse(New String(chars, 0, iSep))) + minutes / 60
    29. Return If(isNegative, -dbl, dbl)
    30. End Function
    Aber wie gesagt, die rechnet Zeiten (Stunden) als Double.
    Das kann man allerdings total simpel in Timespan umrechnen, mit new Timespan(0, value, 0)



    Aber ich denke, du musst eh noch sehr an deim CodeStil arbeiten - schon deine Benamung ist offsichtlich ganz undurchdacht, und daraus folgend teilweise Irreführend.
    Etwa einen Timespan als Zahl1 zu benennen geht garnet.
    Weil ein Timespan ist keine Zahl, und deshalb darf er keinesfalls !!! so heissen.
    Du hast noch viel vor, und wenn du schon bei so Kleinigkeiten schluderst, hast du keine Chance.
    (Doch, eine einzige: Aufhören mit Schludrigkeit ;) )



    Achso, nochwas: Wenn du weiterhin Code einstellen willst, vlt. auch mal komplizierteren, solltest du das hier benützen:

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo
    Vielen Dank für die Promte Anwort. In der zwischen Zeit habe ich die lösung gefunden dies per zufall.
    anstelle Textbox nimmt man Maskedtextbox dies oben rechts auf den pfeil anklicken un dann auf die Zeit wählen, so mit muss mann keine doppelpunkte eintippen.

    jetzt stehe ich beim nächsten Problem mit diesem Code rechte er mir die Zeit aus alles tip top nun ist die Frage wie muss ich es formatieren wenn es über 24 stunden geht.

    das heisst wenn ich zum beispiel 20:00 Uhr arbeitsbeginn ist und die arbeitszeit ist 8 stunden, dann ist Arbeitsende 04:00 Uhr

    20:00 + 8 = 04:00 Uhr

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Zahl1 As TimeSpan
    3. Dim Zahl2 As TimeSpan
    4. Dim Ergebnis As TimeSpan
    5. TimeSpan.TryParse(MaskedTextBox2.Text, Zahl1)
    6. TimeSpan.TryParse(MaskedTextBox1.Text, Zahl2)
    7. Ergebnis = Zahl1 _
    8. + Zahl2
    9. Label1.Text = Ergebnis.ToString()


    Beste Grüsse

    * CodeTags eingefügt * ~NoFear23m
    Bilder
    • masket.PNG

      1,02 kB, 240×130, 162 mal angesehen

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

    @daspu
    Bitte verwende CodeTags um Code hier im Forum einzufügen. Wie das geht hat dir ErfinderDesRades freudlicherweise ja gepostet, wiederholtes irgnorieren wird nicht tolleriert.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Versuchs mal so, wenn du unbedingt mit den Masked-Textboxes arbeiten willst

    VB.NET-Quellcode

    1. Dim arbeitstotal As Int64
    2. Dim arbeisstart = Me.SplitTime(Me.TbmArbeitsBeginn.Text)
    3. Dim arbeisende = Me.SplitTime(Me.TbmArbeitsEnde.Text)
    4. Dim tmp as TimeSpan
    5. If arbeisende < arbeisstart Then
    6. tmp = TimeSpan.FromHours(24) + arbeisende - arbeisstart
    7. arbeitstotal = tmp.Ticks
    8. Me.TbmArbeitsTotal.Text = Me.CalcTime(arbeitstotal)
    9. Return
    10. End If
    11. tmp = arbeisende - arbeisstart
    12. arbeitstotal = tmp.Ticks
    13. Me.TbmArbeitsTotal.Text = Me.CalcTime(arbeitstotal)
    14. Private Function SplitTime(stime As String) As TimeSpan
    15. Dim split = stime.Split({":"c}, StringSplitOptions.RemoveEmptyEntries)
    16. Return New TimeSpan(CInt(split(0)), CInt(split(1)), 0)
    17. End Function
    18. Private Function CalcTime(t As Int64) As String
    19. Dim st = TimeSpan.FromTicks(t)
    20. Return String.Format("{0}:{1}",
    21. st.Hours.ToString.PadLeft(2, "0"c),
    22. st.Minutes.ToString.PadLeft(2, "0"c))
    23. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    daspu schrieb:

    das heisst wenn ich zum beispiel 20:00 Uhr arbeitsbeginn ist und die arbeitszeit ist 8 stunden, dann ist Arbeitsende 04:00 Uhr
    Das ist nicht ganz richtig, bzw unvollständig gedacht.
    Ein Arbeitsbeginn kann niemals 20:00 sein.
    Es ist immer 20:00 an einem bestimmten Tag.
    Und nach 8h ist das Arbeits-Ende auch nicht 4:00, sondern 4:00 am nächsten Tag.
    Du musst also immer das Datum in deine Berechnungen einbeziehen.
    Hallo zusammen

    Zwar bin ich ein Anfänger im vb. Im Excel habe ich die Tabelle erstellt und arbeite seit lenerem damit . Nun wollte ich dies im VB durchführen. Jedoch dach ich nie das es so kompliziert ist im VB.

    nun gut.
    Ich habe ein Tourenplan mit div. Kunden
    1. darum habe ich die Kontrollzeit von den Kunden
    2. der Wegzeit von Kunde zu Kunde
    3 dann muss ich dies zusammen addieren daher Kontrollzeit + Wegzeit + Pause das gibt dann die Totale Arbeitszeit.
    4. der Arbeitsbeginn ist verschieden, nun die Arbeitszeit addieren mit Arbeitsbeginn.
    so mehr brauche ich nicht. vom code habe ich keine ahnung darum probiere ich alles aus, bis es funktioniert.
    nun die Frage wie müsste ich vorgehen.

    Besten Dank


    MFG