Natriumarm Geschrieben 21. April 2008 Teilen Geschrieben 21. April 2008 Hallo, ich hab folgendes Problem. Ich lese aus einer Datenbank (Access^^) tägliche Arbeitszeiten aus. Es wird momentan berechnet Ende - Anfang, somit erhalte ich schon korrekter Weise meine täglichen Arbeitsstunden. Nun möchte ich ALLE Arbeitsstunden aufaddieren. Die Ausgabe soll natürlich in Stunden sein, sodass am Ende bspw 38 Stunden rauskommen. Anbei, ein wenig Code, so wie es momentan ausschaut - habe für die Zeitberechnung bisher Calendar- Objekte verwendet: while (rs.next()) { Beginn = rs.getString("Beginn").substring(11,16); System.out.println("Arbeitsbeginn: "+Beginn); Ende = rs.getString("Ende").substring(11,16); System.out.println("Arbeitsende: "+Ende); Arbeitsbeginn = Beginn.split(":"); Arbeitsende = Ende.split(":"); c1.set(Calendar.HOUR, Integer.parseInt(Arbeitsbeginn[0])); c2.set(Calendar.HOUR, Integer.parseInt(Arbeitsende[0])); if ( c1.getTimeInMillis() < c2.getTimeInMillis()) { c3.set(Calendar.HOUR, Integer.parseInt(Arbeitsende[0]) - Integer.parseInt(Arbeitsbeginn[0])); c3.set(Calendar.MINUTE, Integer.parseInt(Arbeitsende[1])-Integer.parseInt(Arbeitsbeginn[1])); System.out.println("gearbeitet: " +DateFormat.getTimeInstance(DateFormat.SHORT).format(c3.getTimeInMillis())); System.out.println(""); c4.set(Calendar.HOUR, c4.HOUR + c3.HOUR); c4.set(Calendar.MINUTE, c4.MINUTE + c3.MINUTE); System.out.println("Gesamtarbeit: " +DateFormat.getTimeInstance(DateFormat.SHORT).format(c3.getTimeInMillis())); System.out.println(""); System.out.println(""); } if (c1.getTimeInMillis() > c2.getTimeInMillis()) { c3.set(Calendar.HOUR, Integer.parseInt(Arbeitsende[0]) - Integer.parseInt(Arbeitsbeginn[0])-12); c3.set(Calendar.MINUTE, Integer.parseInt(Arbeitsende[1])-Integer.parseInt(Arbeitsbeginn[1])); System.out.println("gearbeitet: " +DateFormat.getTimeInstance(DateFormat.SHORT).format(c3.getTimeInMillis())); System.out.println(""); c4.set(Calendar.HOUR, c4.HOUR + c3.HOUR); c4.set(Calendar.MINUTE, c4.MINUTE + c3.MINUTE); System.out.println(""); System.out.println(""); System.out.println("Gesamtarbeit: " +DateFormat.getTimeInstance(DateFormat.SHORT).format(c3.getTimeInMillis())); } Durchs Quelltext kopieren, könnte das einrücken nicht mehr richtig sein :bimei Vielen Dank im Vorraus schonmal Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 21. April 2008 Teilen Geschrieben 21. April 2008 Warum holst du das Datum als String raus? Gibt doch Datumsdatentypen für die Spalten... Für die Summe entweder SUM() nehmen oder einfach eine Variable deklarieren, die die Werte beim Schleifendurchlauf mitzählt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
BlinderOpa Geschrieben 22. April 2008 Teilen Geschrieben 22. April 2008 Rechne für jeden Tag die Stundenzahl aus... schreibt in ein Array... und dann zähl die Stunden zusammen... und wenn du lustig bist machst du aus dem Array mit 2ddraw ein Diagramm... oder eine Schleife die Tag für Tag durchgeht... und immer gesamtStunden=gesamtStunden+tagesStunden; macht... was mein vorschreiber glaub ich gemeint hat ist sowas wie rs.getDate("beginn") aber da kommt es darauf an, ob die Datenbank (die du sicherlich nicht ändern sollst) die Daten als Datum oder als eigen-kreations-String abspeichert... keine Ahnung, wie sich da Access verhält Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 22. April 2008 Teilen Geschrieben 22. April 2008 was mein vorschreiber glaub ich gemeint hat ist sowas wie rs.getDate("beginn") aber da kommt es darauf an, ob die Datenbank (die du sicherlich nicht ändern sollst) die Daten als Datum oder als eigen-kreations-String abspeichert... keine Ahnung, wie sich da Access verhält Bei Access gibt es einen Datentyp Date/Datum, von daher sollte das passen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Natriumarm Geschrieben 28. April 2008 Autor Teilen Geschrieben 28. April 2008 Hallo, danke für die Tips. Habs jetzt etwas anders gemacht, ich zähl die Minuten zusammen und teile diese dann durch 60. Bei den Stunden zusammen zählen gibs ein Problem. Bei 24h kommt der Sprung in den nächsten tag quasi - so das ich bei 25h 1h ausgegeben bekomme. Habs jetzt wie gesagt mit den Minuten gemacht, gibt es da aber doch noch ne Möglichkeit dem Kalendar beizubringen das er einfach über 24 hinweg addieren soll ohne umzubrechen?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 28. April 2008 Teilen Geschrieben 28. April 2008 Wie wärs mit add()?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Dragon8 Geschrieben 28. April 2008 Teilen Geschrieben 28. April 2008 Wie wärs mit add()?! Was die vorgabe des Threaderstellers aber auch nicht erfüllt. Er möchte ja, dass das Calendar Objekt die stunden immer weiter hinzuaddiert, ohne dass nach 24 stunden nen neuer tag hinzukommt, was mit der add() methode meiner meinung nach nicht klappt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Natriumarm Geschrieben 28. April 2008 Autor Teilen Geschrieben 28. April 2008 Jup, Dragon hat Recht, genau wie beschrieben kommt bei 24h der Sprung, das heißt add() funktioniert so nicht, daher die Frage, ob man dem Calendar beibringen kann nicht zu springen sondern stupide weiter zu zählen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 28. April 2008 Teilen Geschrieben 28. April 2008 achso, jetzt hab ich verstanden, was du meintest. (Ist noch früh am Morgen. ) Dann fügst du halt mit add die Minuten hinzu und addierst dann einfach den Abstand in Tagen (Achtung beim Jahreswechsel) * 24 und dessen aktuelle Stunden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wayne Geschrieben 28. April 2008 Teilen Geschrieben 28. April 2008 Jup, Dragon hat Recht, genau wie beschrieben kommt bei 24h der Sprung, das heißt add() funktioniert so nicht, daher die Frage, ob man dem Calendar beibringen kann nicht zu springen sondern stupide weiter zu zählen. Also das wäre mir vollkommen neu und meines Erachtens auch gegen den Zweck der Klasse Calendar. Aber falls es doch eine Möglichkeit geben sollte, dann steht das bestimmt in der API-Doku von Sun. Wenn ich es richtig verstanden habe, dann hast du in einer Datenbank Anfangs- und Endzeit als String stehen im Format HH24:mm. Warum nicht als Date? So würde das Spliten und Parsen wegfallen und du könntest dir bequem die Millisekunden ausgeben lassen und damit weiter arbeiten. mal ein bisschen Code zur Anregung. Calendar beginn = Calendar.getInstance(); beginn.clear(); beginn.set(2007, 9, 10, 8, 30); Calendar ende = Calendar.getInstance(); ende.clear(); ende.set(2007, 9, 10, 18, 00); double diff = ende.getTimeInMillis() - beginn.getTimeInMillis(); System.out.println("Differenz in Millisekunden: " + diff); diff /= 1000; //entspricht diff = diff / 1000; System.out.println("Differenz in Sekunden: " + diff); diff /= 60; System.out.println("Differenz in Minuten: " + diff); diff /= 60; System.out.println("Differenz in Stunden: " + diff); Desweiteren ist es empfehlenswert, dass du variablen klein schreibst. AUch deine IF Ausdrücke lassen sich optimieren. Du machst in beiden IFs bis auf eine Zeile genau das gleiche und hast somit 8 Zeilen doppelt. Das heißt würdest du in dem einen Ausdruck etwas ändern musst es sogleich im zweiten Ausdruck "neu machen" => fehleranfällig. Außerdem schließen sich die beiden Bedingungen aus. Jedes mal wenn er die schleife durchläuft prüft er beide Bedingungen obwohl es gar nicht nötig ist. Also könntest du auch schreiben: if (x < y){ //tu was } else if (y > x){ //tu was anderes }// else { //was ist wenn x und y genau gleich sind? //} //tu etwas, was alle Fälle betrifft Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Natriumarm Geschrieben 30. April 2008 Autor Teilen Geschrieben 30. April 2008 Hallo, hab auf die schnelle keine Lösung mit Kalendar oder ähnlichem gefunden, daher hier meine Lösungsvariante, für Leute die eventuell das selbe Problem haben / hatten. public static String getWochenIst(String montag, String dienstag, String mittwoch, String donnerstag, String freitag) { String [] Mo = montag.split(":"); String [] Di = dienstag.split(":"); String [] Mi = mittwoch.split(":"); String [] Do = donnerstag.split(":"); String [] Fr = freitag.split(":"); int gesamt = 0; String saldo; int zeit_mo = (Integer.parseInt(Mo[0])*60) + Integer.parseInt(Mo[1]); int zeit_di = (Integer.parseInt(Di[0])*60) + Integer.parseInt(Di[1]); int zeit_mi = (Integer.parseInt(Mi[0])*60) + Integer.parseInt(Mi[1]); int zeit_do = (Integer.parseInt(Do[0])*60) + Integer.parseInt(Do[1]); int zeit_fr = (Integer.parseInt(Fr[0])*60) + Integer.parseInt(Fr[1]); gesamt = zeit_mo + zeit_di + zeit_mi + zeit_do + zeit_fr; saldo = String.valueOf((gesamt/60)+":"+(gesamt%60)); System.out.println(saldo); return saldo; } Zur Erklärung. ich bekomme einen String in Form von "hh:mi". Diesen zerlege ich in das entsprechende array per split(). Dann wandel ich die einzelnen Arrayfelder in eine Ganzzahl (int), die die Minuten für jeden Tag repräsentiert. Die *60 ergibt sich aus der Anzahl der Stunden mal 60 = Anzahl der Minuten. Die rhaltenen Minuten werden dann dann zusammengezählt und wieder durch 60 geteilt. Die Vorkommazahl sind die Gesamtwochenstunden. Um die restminuten zu erhalten, nutze ich die Modulofunktion. Das beides wird in einen neuen String gepackt im Format "hh:mi" und ausgegeben. Falls Verbesserungsvorschläge einfallen, bitte gern posten, bin immer offen für Tips. MFG Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wayne Geschrieben 30. April 2008 Teilen Geschrieben 30. April 2008 Ich nehme mal an die übergebenen Strings sollen die Arbeitszeit für den jeweiligen Tag darstellen. Wie hast du das errechnet? Wenn du das errechnet hast, dann wüsste ich nicht wo dein Problem mit Calendar liegt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.