Benutzer mit den meisten Antworten
Zeitspanne mit Servicezeiten

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
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- Als Antwort vorgeschlagen Giftzwockel Donnerstag, 9. September 2010 08:23
- Bearbeitet Robert Breitenhofer Donnerstag, 9. September 2010 15:10 Formatierung
- Als Antwort markiert Robert Breitenhofer Dienstag, 16. November 2010 08:02
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- Als Antwort vorgeschlagen Giftzwockel Donnerstag, 9. September 2010 08:23
- Bearbeitet Robert Breitenhofer Donnerstag, 9. September 2010 15:10 Formatierung
- Als Antwort markiert Robert Breitenhofer Dienstag, 16. November 2010 08:02
-
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 -
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 -
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?
-
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 IfLoop
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- Bearbeitet Robert Breitenhofer Dienstag, 16. November 2010 07:56 Formatierung
-
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 -
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 -
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...
-
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- Bearbeitet Robert Breitenhofer Dienstag, 16. November 2010 08:01 Formatierung
-
Schau dir mal den thread "V08: addhours nicht mit 24h Tag" in vb-fun.de an. Da wurde das gleiche Problem diskutiert.
--
Peter