none
Zeitspanne mit Servicezeiten RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte gerne eine Anwendung programmieren wo ich eine Anfangszeit und eine Endzeit eingeben kann und dann spuckt das Programm die Zeit dazwischen aus (z.B. 1 Tag 13 Std. und 35 Minuten). Problem ist nur dass ich Servicezeiten berücksichtigen muss.

    Sprich: Ich will die Zeit nur von z.B. 6 Uhr bis 19 Uhr rechnen, zudem das Wochenende rausrechnen. Also soll auch nur die Zeitspanne innerhalb dieser Servicezeit berechnet werden.

    Wie aber beginne ich hier???

    Ich hoffe ich habe mich verständlich ausgedrückt. :-) Vielen Dank schonmal.

    LG Daniel

    Dienstag, 7. September 2010 18:03

Antworten

  • Hier mal eine Konsolendemo, die zeigt, wie mal aus einem TimeSpan Sonnabend und Sonntag eleminieren kann:
     

     

    Module Module1
    
     Sub Main()
     Dim d1 = CDate("10.9.2010 22:15")
     Dim d2 = CDate("14.9.2010 7:13")
     Dim ts = d2.Subtract(d1)
     Dim days = ts.Days
     Do While d1 < d2
      d1 = d1.AddDays(1)
      If d1.DayOfWeek = DayOfWeek.Saturday Or d1.DayOfWeek = DayOfWeek.Sunday Then
      days -= 1
      End If
     Loop
     Console.WriteLine("{0} Tage, {1} h, {2} min", days, ts.Hours, ts.Minutes)
     Console.WriteLine("--- Ende mit beliebiger Taste")
     Console.ReadKey()
     End Sub
    
    End Module
    

     

    --
    Viele Gruesse
    Peter

    Dienstag, 7. September 2010 20:47

Alle Antworten

  • Hier mal eine Konsolendemo, die zeigt, wie mal aus einem TimeSpan Sonnabend und Sonntag eleminieren kann:
     

     

    Module Module1
    
     Sub Main()
     Dim d1 = CDate("10.9.2010 22:15")
     Dim d2 = CDate("14.9.2010 7:13")
     Dim ts = d2.Subtract(d1)
     Dim days = ts.Days
     Do While d1 < d2
      d1 = d1.AddDays(1)
      If d1.DayOfWeek = DayOfWeek.Saturday Or d1.DayOfWeek = DayOfWeek.Sunday Then
      days -= 1
      End If
     Loop
     Console.WriteLine("{0} Tage, {1} h, {2} min", days, ts.Hours, ts.Minutes)
     Console.WriteLine("--- Ende mit beliebiger Taste")
     Console.ReadKey()
     End Sub
    
    End Module
    

     

    --
    Viele Gruesse
    Peter

    Dienstag, 7. September 2010 20:47
  • Hallo,

    sind die Servicezeiten denn fest, oder werden diese dynamisch generiert/eingetragen?

    Das einfachste wäre meiner Meinung nach es einfach zu berechnen. Du kannst eine TimeSpan erstellen, und dann erstmal alle Sonntage und Samstage eliminieren wie Peter es aufgezeigt hat.

    Nun hast du nur noch Arbeitstage, und da du genau weißt, wie lange an einem Tag gearbeitet wird (Servicezeiten = 13h) kannst du einfach die Anzahl der Tage * die Servicezeiten rechnen und solltest auf dein Ergebnis kommen.

    Eventuell ist es da auch einfacher in Minuten zu rechnen, kommt ganz auf deine Servicezeiten an ;-)


    MfG, Sebastian Gross
    Dienstag, 7. September 2010 22:25
  • Hallo Raedl,

    nur mal so ein Gedanke den ich mal in einem meiner Programme unter C++ umgesetzt hatte, was hältst du denn von einer positiven Zeiterfassung bei der man selbst Start und Ende der Servicezeiten eingibt. Über TimeSpan lässt sich die Zeit gut berechnen und ggf. sogar in einer Datenbank für ein Projekt aufaddieren.


    Liebe Grüße Stefan
    Mittwoch, 8. September 2010 11:52
  • Also unsere Servicezeiten sind fest von Montag bis Freitag, von daher wärs einfacher.
    Vielen vielen Dank für eure Antworten. Ich werd's mal versuchen und bei Problemen meld ich mich einfach wieder.

    Mittwoch, 8. September 2010 17:43
  • Do While d1 < d2
     d1 = d1.AddDays(1)
     If d1.DayOfWeek = DayOfWeek.Saturday Or d1.DayOfWeek = DayOfWeek.Sunday Then
     days -= 1
     End If
     Loop
    

    Könntet ihr vielleicht den obigen Code erklären (vor allem die Zeile 2) warum ich den brauche bzw. was der Zweck dieser Anweisung ist?!

    Zudem würde ich gerne wissen ob es möglich wäre einen eigenen Tag zu "erschaffen", der dann eben nur von 6:15 bis 19 Uhr geht? Und dann sollte es ja ein einfaches sein die Zeitspanne auszulesen?

    Donnerstag, 9. September 2010 19:58
  • Hallo Raedel,

    Hier ein Erklärungsversuch:

    Do While d1 < d2
       d1 = d1.AddDays(1)

       If d1.DayOfWeek = DayOfWeek.Saturday Or d1.DayOfWeek = DayOfWeek.Sunday Then
        days -= 1
       End If

    Loop

    1. Die Anweisung wird so lange durchführt, bis die Bedingung der Do While-Anweisung nicht mehr zutrifft. Hier wird eben danach geprüft ob der Wert für d1 kleiner dem Wert von d2 ist. Solange dies der Fall ist wird d1 hoch gezählt indem d1 = d1 plus 1 Tag  berechnet wird.

    Nachdem hier eine einfache Addition durchgeführt wird, scheint es mir so, als ob die Tage einfach durchnummeriert werden.
    Hast du also Tag 3 wird beim Durchlauf der Schleife folgendes passieren:

    D1 = Tag3

    D1 = D1.AddDays(1) im Klartext Tag3=Tag3 + 1

    Aus d1 wird also der Wert 4 der beim nächsten Durchlauf als d1 steht und mit d2 verglichen wird.

    Im nächsten Vergleich wird der numerische Wert des Tages mit dem Wochentag Samstag verglichen. M.W. ist

    0 = Sonntag, 1 = Montag, 2 = Dienstag, 3 = Mittwoch, 4 = Donnerstag, 5 = Freitag und 6 = Samstag.

    Wenn also d1 = 6 ist, dann ist das ein Samstag. Da du Samstage und Sonntage nicht zählen willst, subtrahierst du von days 1.

    Ich hoffe ich habe das nun inhaltlich so wieder gegeben, dass es fachlich nichts zu beanstanden gibt und dennoch von Ablauf her verstanden wird.

    Würde mich jedenfalls freuen.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    Samstag, 25. September 2010 21:39
  • Hallo Raedel,

     

    Zudem würde ich gerne wissen ob es möglich wäre einen eigenen Tag zu "erschaffen", der dann eben nur von 6:15 bis 19 Uhr geht? Und dann sollte es ja ein einfaches sein die Zeitspanne auszulesen?

     

    Nun du wirst in deinem Programm ja irgendwie ohnehin die Zeit für Arbeitsbeginn und Arbeitsende abfragen. Vielleicht macht ja mal jemand Überstunden oder kommt einem Kundenwunsch nach und kommt früher.

    Wenn das gänzlich ausgeschlossen ist, kannst du Anfang und Ende über eine If –Then-Abfrage überwachen. Sinngemäß

     

    If Anfangszeit < Arbeitsbeginn Then

    Anfangszeit = Arbeistbeginn

    End If

     

    If Feierabend > EndeArbeitszeit Then

    Feierabend = EndeArbeitszeit

    End If

     

    Code und Variablen habe ich jetzt ohne Bezug auf den bisherigen Thread geschrieben.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    Samstag, 25. September 2010 21:47
  • Hallo Daniel,

    ist das Thema für dich noch von Interesse bzw, haben die Beiträge dir irgendwie weitergeholfen?
    Falls nein, wo gibt es konkret Probleme?

    Wenn du die hilfreichen Beiträge oder sogar die Antwort, die die Lösung brachte markierts, hilft das auch anderen, die beim googeln ggf. auf diesen Thread stoßen.


    Liebe Grüße Stefan ------------------------------------------------ Ich verwende Visual Basic 2008 Express
    Mittwoch, 29. September 2010 21:21
  • Hallo,

    vielen Dank erstmal für eure Beiträge. Eure Beiträge sind immer sehr hilfreich.

    Ich hab nun mein Programm fertig...nur ich steh immer noch vor dem Problem dass ich z.B. zu einem Zielzeitpunkt meine erechnete Zeitspanne nich hinzuaddieren kann. Denn sollte der Zielzeitpunkt z.B. der 05.11.2010 11:15 Uhr sein und meine erechnet Zeitspanne beträgt 1 Tag 5 Stunden und 2 Minuten, dann kann ich das ja nicht einfach addieren weil der berechnete eine Tag ja nur von 6 Uhr bis 19 Uhr geht...

    Es ist kompliziert aber ich hoffe ihr versteht mein Problem. :-) Vielleicht denke ich aber auch nur zu kompliziert...

    Vielen Dank schon mal...

    Donnerstag, 7. Oktober 2010 17:29
  • Hallo Raedl, über die Arbeits- und Funktionsweise sollte man sich im Ideal- und Normalfall vorher Gedanken machen.

    Wenn du allgemein dein Programm so gestaltet hast, dass ohnehin nur während der Werktage zu bestimmten Zeiten eine Zeiterfassung stattfindet, kannst du die Zeiten dazwischen also z.B. nach Feierabend bis Arbeitsbeginn (19:00 - 06.00 = 11 Stunden) pauschal von der tatsächlichen Zeitspanne abziehen.

    Du rechnest also mit der tatsächlichen Zeitspanne und korrigierst diese um den unzulässigen Korrekturfaktor.
    Die Berechnung ist eine einfache Subtraktion mit TimeSpan http://www.vbarchiv.net/forum/read.php?id=10&t=41992&i=41992&v=f

    Donnerstag, 7. Oktober 2010 21:38
  • Schau dir mal den thread "V08: addhours nicht mit 24h Tag" in vb-fun.de an. Da wurde das gleiche Problem diskutiert.

    --
    Peter

    Freitag, 12. November 2010 21:09