Mit Uhrzeiten rechnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Mit Uhrzeiten rechnen

    Hallo,Ich versuche eine Art Auftragsübersicht zu programmieren und komme nicht weiter. Ich habe ein Datum Uhrzeit z.B 09.12.2016 20:00 Uhr. Jetzt weiß ich zum Beispiel dass der Auftrag noch 3 Stunden mit aktueller Produktivität läuft. Jetzt soll wenn ich 09.12.2016 20:00 Uhr mit 3 Stunden addiere 12.12.2016 7:00 Uhr rauskommen, da die Arbeitszeit Montag bis Freitag von 6:00 Uhr bis 22:00 Uhr geht. Habt ihr eine Idee? Wisst ihr was ich meine ? Gruß Sven
    @Svenundmel Zunächst solltest Du wissen, was der Unterschied ist zwischen 12 Uhr und 12 Stunden.
    Frage:
    Was ist:
    1) 24. Dezember 2016 PLUS 24 Dezember 2015?
    Was ist:
    2) 24. Dezember 2016 MINUS 24 Dezember 2015?
    Wenn Du das verinnerlicht hast, funktioniert der Rest mit den Klassen
    DateTime und TimeSpan.
    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!
    Hi,

    ​danke für deine Antwort. Ich habe nur leider keine Ahnung :( Ich bin Anfänger, weiß zwar wie du meinst (Jetzige Zeit mit Arbeitsendzeit verrechnen, das was übrig bleibt zu Arbeitsanfang nächster Tag addieren. ) , aber ich habe keine Idee, da anzufangen. Meinst du, du könntest mir ein bisschen mehr helfen? Mit Codesnips oder so...
    ​Vielen Dank

    Svenundmel schrieb:

    ein bisschen mehr helfen
    Dann beantworte zunächst die Datumsfragen oben.
    Mit reinen Snippets ist da nicht geholfen, wenn Du das Prinzip nicht verstehst.
    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!
    Hier ein Ansatz:
    Der Ansatz hier ist die Stunden vom Tag im Anfangsdatum zu nehmen und diese dann mit den zu addierenden Stunden auszuwerten. Das Ganze geht dann ähnlich mit den Tagen.
    Du hast pro Tag zwischen 6:00 und 22:00 Uhr Zeit, das sind dann 16 Stunden pro Tag.
    Wenn man nun genau 16 Stunden addieren möchte wäre dies genau ein Tag. Dementsprechend muss man sich nur um die Reststunden kümmern.
    Nun muss man sich überlegen wie man mit den Reststunden und den Stunden vom Tag (in dem Fall sind es 5 Stunden) vom Anfangsdatum umgeht.

    Überlegungen zu den Stunden:
    => Wieviel Tage sind in den zu addierenden Stunden drin?
    => Was sind die Reststunden, wenn die Tage abgezogen sind?
    => Sind die Stunden vom Anfangsdatum < 6?
    => Sind die Stunden vom Anfangsdatum + Reststunden > 22?
    (=> Ist Wochenende?)

    Ein Beispiel:
    Sagen wir du möchtest nun 33 Stunden addieren und dein Startdatum ist 09.12.2016 05:10:01
    => 2 Tage (Math.Floor(33 / 16))
    => Rest 1 Stunde (33mod16)
    => da 5 < 6 und 6-5 = 1 schon mal 1 Stunde draufaddieren = > 2 Stunden
    (=> 5+2= 7 < 22 also ok, der Schritt wäre hier unnötig weil der Rest immer kleiner 16 ist und somit ist das Ergebnis immer kleiner 22, ansonsten 8 Stunden beim Ergebnis obendrauf)
    (=> Freitag also nein bei Wochenende müsste man die Zeit nicht addieren, es wurde dann ab Montag 7 Uhrlosgehen)

    Die Stunden vom Tag des Anfangsdatums bekommst du mit DeinDatum.TimeOfDay.Hours.

    Damit wären wir nun aktuell bei 2 Tagen und 2 Stunden. Nun müsste man noch die Wochen/Tage auswerten da ja eine Woche = 5 Tage etc.... (hier kann DayOfWeek hilfreich sein).
    .
    to do
    .
    Komme dann auf 4 Tage und 2 Stunden => Anfangsdatum.add(New TimeSpan(4,2,0,0))


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim resultDate As Date = Date.MinValue
    2. Dim startDate As Date = Date.MinValue
    3. Dim toAddHours As Integer = 0
    4. Dim toAddDays As Integer = 0
    5. Dim restHours As Integer = 0
    6. Dim startDateDayHours As Integer = 0
    7. startDate = Me.DateTimePickerMain.Value
    8. toAddHours = 33
    9. '16 Stunden pro Tag
    10. toAddDays += CInt(Math.Floor(toAddHours / 16))
    11. 'Die restlichen Stunden
    12. restHours = toAddHours Mod 16
    13. startDateDayHours = startDate.TimeOfDay.Hours
    14. 'todo Abfrage ob der Tag im Wochenende ist (startdate.DayOfWeek)
    15. 'Wenn es vor 6 Uhr ist müssen Stunden hinzugefügt werden
    16. If startDateDayHours < 6 Then
    17. restHours += (6 - startDateDayHours)
    18. ElseIf (startDateDayHours + restHours) > 22 Then
    19. 'todo 8 Stunden plus da 22:00 bis 6:00 = 8 Stunden
    20. End If
    21. 'todo Auswertung Tage
    22. 'Hinzufügen der Timespan
    23. resultDate = startDate.Add(New TimeSpan(toAddDays, toAddHours, 0, 0))


    Hoffe das hilft dir weiter

    Edit: Habe es versucht etwas verständlicher zu machen.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „korni“ ()

    Svenundmel schrieb:

    Oder steh ich auf dem Schlauch
    Offensichtlich. ;)
    Das Resultat der zweiten Aufgabe (Datum MINUS Datum) ist 1 Jahr mit der Einheit Zeitspanne (Dauer).
    Die erste Aufgabe (die Operation Datum PLUS Datum) ist nicht definiert. 8o
    Definiert ist allerdings Datum PLUS|MINUS Zeitspanne.
    Da Du das offensichtlich noch nicht verinnerlicht hast, hat es leider keinen Zweck, Dir Codeschnipsel zuzuwerfen. ;(
    ===============
    @korni Dein Beitrag ist leider sehr verwirrend.
    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!