Timespan über den Tageswechsel nur mit DateTime?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Timespan über den Tageswechsel nur mit DateTime?

    Hallo,

    vielleicht könnt ihr mir kurz auf die Sprünge helfen.
    Ich will möchte verschiedene TimeSpans im 3-Schichtbetrieb berechnen. Dabei immer die Zeit vom Schichtbeginn bis zur aktuellen Minute. Startzeit ist quasi immer 06:00, 14:00 und 22:00 Uhr.
    Das Problem ist, wenn es z.B. 00:45 Uhr ist und ich auf 22 Uhr zurück rechne, dann hätte ich theoretisch 165 Minuten, ausgegeben werden jedoch -1275.
    Der Grund ist mir bewusst, da er nicht weiß, dass ich 22 Uhr vom Vortag meine und er voraus berechnet.

    Muss ich nun zwingend mit Date rechnen oder gibt es eine einfacheren Weg?

    VB.NET-Quellcode

    1. 'Schichtzeiten festlegen (nicht verwendet)
    2. Dim jetzt = DateTime.Now
    3. Dim FS_S = jetzt.Date.AddHours(6).AddMinutes(0) 'Start Frühschicht
    4. Dim FS_E = jetzt.Date.AddHours(13).AddMinutes(59) 'Ende Frühschicht
    5. Dim SS_S = jetzt.Date.AddHours(14).AddMinutes(0) 'Start Spätschicht
    6. Dim SS_E = jetzt.Date.AddHours(21).AddMinutes(59) 'Ende Spätschicht
    7. Dim NS_S = jetzt.Date.AddHours(22).AddMinutes(0) 'Start Nachtschicht
    8. Dim NS_E = jetzt.Date.AddHours(5).AddMinutes(59) 'Ende Nachtschicht
    9. 'Uhrzeiten festlegen
    10. Dim sTime1 As String = "06:00"
    11. Dim sTime2 As String = "14:00"
    12. Dim sTime3 As String = "22:00"
    13. Dim sTimeNow As String = DateTime.Now.Hour & ":" & DateTime.Now.Minute
    14. 'Uhrzeiten in TimeSpan-Objekte überführen
    15. Dim Time1 As TimeSpan = TimeSpan.Parse(sTime1)
    16. Dim Time2 As TimeSpan = TimeSpan.Parse(sTime2)
    17. Dim Time3 As TimeSpan = TimeSpan.Parse(sTime3)
    18. Dim TimeNow As TimeSpan = TimeSpan.Parse(sTimeNow)
    19. Dim TimeDummy As TimeSpan
    20. 'Chechbox für Schicht
    21. Select Case Date.Now.Hour
    22. Case 6 To 13
    23. TimeDummy = Time1
    24. chkF1.Checked = True
    25. chkF2.Checked = False
    26. chkF3.Checked = False
    27. Case 14 To 21
    28. TimeDummy = Time2
    29. chkF1.Checked = False
    30. chkF2.Checked = True
    31. chkF3.Checked = False
    32. Case 22 To 23
    33. TimeDummy = Time3
    34. chkF1.Checked = False
    35. chkF2.Checked = False
    36. chkF3.Checked = True
    37. Case 0 To 5
    38. TimeDummy = Time3
    39. chkF1.Checked = False
    40. chkF2.Checked = False
    41. chkF3.Checked = True
    42. End Select
    43. 'Zeitdifferenz in Minuten berechnen
    44. Dim nMin As Integer = 0
    45. With TimeNow.Subtract(TimeDummy)
    46. nMin = .Hours * 60 + .Minutes
    47. End With
    @Murdersquad Du verwendest Strings, die nichts von Datum wissen.
    Verwende ausschließlich DataTime-Instanzen von heute (DateTime.Now.Date) und gib ihnen die entsprechenden Uhrzeiten mit.
    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 habe es jetzt mal so gelöst und es sieht ganz gut aus:

    VB.NET-Quellcode

    1. Dim FSS As String = "06:00"
    2. Dim SSS As String = "14:00"
    3. Dim NSS As String = "22:00"
    4. Dim heute As String = Now.ToString("dd.MM.yyyy")
    5. Dim gestern As String = Now.AddDays(-1).ToString("dd.MM.yyyy")
    6. Dim jetzt As DateTime = DateTime.Now
    7. Dim start As DateTime
    8. Dim FS As String = heute & " " & FSS
    9. Dim SS As String = heute & " " & SSS
    10. Dim NS As String
    11. Select Case Date.Now.Hour
    12. Case 6 To 13
    13. start = DateTime.Parse(FS)
    14. Case 14 To 21
    15. start = DateTime.Parse(SS)
    16. Case 22 To 23
    17. NS = heute & " " & NSS
    18. start = DateTime.Parse(NS)
    19. Case 0 To 5
    20. NS = gestern & " " & NSS
    21. start = DateTime.Parse(NS)
    22. End Select
    23. MsgBox(DateDiff(DateInterval.Minute, start, jetzt))

    Murdersquad schrieb:

    und es sieht ganz gut aus
    Für mich nicht.
    Offensichtlich bist Du nicht bereit, in .NET zu programmieren. X(
    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!
    @Murdersquad
    kompliziert was du da machst.

    warum nicht einfacher...

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim startTime As New DateTime(2023, 1, 31, 22, 0, 0)
    3. Dim endTime As New DateTime(2023, 2, 1, 6, 30, 0)
    4. Dim duration As TimeSpan = endTime - startTime
    5. MessageBox.Show("Stunden : " & duration.TotalHours)
    6. End Sub

    Murdersquad schrieb:

    Ich kann dir leider nicht folgen.
    Du arbeitest mit Strings, deren Inhalt eine Uhrzeit ohne Bezug zu einem Datum ist.
    In .NET gibt es die Struktur DateTime dafür, was ich Dir bereits in Post #2 schrieb und Du ignoriert hast.
    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!
    @Murdersquad Du konvertierst DateTimes in Strings und dann wieder Strings in DateTime, das ist verwirrend. Das meint der RFG

    Zum Beispiel: Dein FSS ist eine Zeichenfolge, die einer Uhrzeit gleicht. FS setzt da ein Datum davor, welches du auch erstmal konvertierst. Hintendrein sitzt FS aber ganz stumpf in einem DateTime.Parser für start

    Die DateTime-Klasse hat alle Methoden die du brauchst. Typeffizient wäre das von mir genannte Beispiel:

    VB.NET-Quellcode

    1. Dim hFrühschicht as Double = 6.0
    2. Dim heute = DateTime.Today
    3. Dim FS = heute.AddHours(hFrühschicht)
    4. ...start = FS