Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben
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.

Geschrieben

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??

Geschrieben
Wie wärs mit add()?! :rolleyes:

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.

Geschrieben

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.

Geschrieben

achso, jetzt hab ich verstanden, was du meintest.

(Ist noch früh am Morgen. :D)

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.

Geschrieben
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

Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...