Zeit errechnen mit GregorianCalendar

Status
Nicht offen für weitere Antworten.

freez

Top Contributor
Hallo,

ich habe mir hier aus einigen Beiträgen anregungen geholt, um mit der Zeit zu rechnen. Ich möchte mir meine Arbeitszeit ausrechnen, und was ich daraus für +, bzw. - Stunden habe.

Also ganz einfach: IstArbeitszeit - Sollarbeitszeit - Pausenzeit. Und das Ergebniss soll auf mein Stundenkonto rauf gerechnet werden. Zur Info: Ich möchte noch nicht mit Uhrzeiten rechnen, sondern nur mit anzahl von Stunden und Minuten.
Beispiel:

8h 00min Soll
1h 00min pause
8h 50min Ist

Ergebniss
-0h 10min

Jetzt habe ich mit dem GregorianCalendar gerechnet. Naja, leider kommt nicht das richtige Ergebniss dabei raus.

Hier der BeispielCode:
Code:
			GregorianCalendar cZeit = new GregorianCalendar(0,0,0,8,50);
			GregorianCalendar cArbeit = new GregorianCalendar(0,0,0,8,0);
			GregorianCalendar cPause = new GregorianCalendar(0,0,0,1,0);
			GregorianCalendar cGesamt = new GregorianCalendar(0,0,0,0,0);
			
			long lZeit = cZeit.getTimeInMillis();
			long lArbeit = cArbeit.getTimeInMillis();
			long lPause = cPause.getTimeInMillis();
			long lGesamt = cGesamt.getTimeInMillis();
			
			long lDiff = lGesamt + (lZeit - lArbeit - lPause);
			cZeit.setTimeInMillis(lDiff);
			
			Stunden = cZeit.get(Calendar.HOUR); //0
			Minuten = cZeit.get(Calendar.MINUTE);//50

Leider kommt man damit auf 0h 50min. Wie kann ich mein Problem lösen? Gibt es eine bessere Klasse, mit der ich das gewünschte Ergebniss bekomme? Oder habe ich grundlegend was verkehrt gemacht. Naja, ist ja auch schon recht spät :)
 

spidermobile

Bekanntes Mitglied
Also ich habe das so gelöst (returnwert ergibt Minuten !!!):

Code:
	/*
	 * Count Hours
	 */
	public int countHours(Date checkInTime, Date checkOutTime ) {
		
		int countHours = 0;
		int count = 0;

		Calendar outTime = new GregorianCalendar();
		outTime.setTime(checkOutTime);
		Calendar inTime = new GregorianCalendar();
		inTime.setTime(checkInTime);
			
		 long diffMillis = outTime.getTimeInMillis() - inTime.getTimeInMillis();
		 long diffMins = diffMillis/(60*1000);

	return countHours;
	}
 

freez

Top Contributor
hm, fehlt da net was? an welcher stelle beschreibst du die Variable countHours?
Positive Werte funktionieren bei mir Prima. Aber wenn ich mal 10 minuten weniger da war, als ich sollte, gibt es Probleme, weil an sich minuswerte rauskommen sollen.
 

spidermobile

Bekanntes Mitglied
sorry, auch copy and paste will gelernt sein :oops:

Code:
	public int countHours(Date checkInTime, Date checkOutTime ) {
		
		int countHours = 0;
		int count = 0;

		Calendar outTime = new GregorianCalendar();
		outTime.setTime(checkOutTime);
		Calendar inTime = new GregorianCalendar();
		inTime.setTime(checkInTime);
			
		 long diffMillis = outTime.getTimeInMillis() - inTime.getTimeInMillis();
		 long diffMins = diffMillis/(60*1000);

		 countHours = (int)diffMins; 
			
	return countHours;
	}

Sorry, kanns im Monent nicht ausprobieren, aber kann der Wert hier nicht negativ werden? Der Rückgabewert ist doch int?!
 

spidermobile

Bekanntes Mitglied
So hab doch mal schnell gebastelt. Arbeite derzeit an einem ähnlichen Beispiel:



Code:
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class FormatDateTime {

	/*
	 * Formating InputString to DateFormat
	 */
	public static Date formatDate(String inDate) {	
		DateFormat formatDay = new SimpleDateFormat("dd.MM.yyyy");
		Date tmpDate = null;

		try{ 
			tmpDate = formatDay.parse(inDate);		
		 return tmpDate;

		 } 
		 catch (Exception ex) {
			 System.out.println("[ERROR  ]:" + ex);				
			 return null;
		 }
	}

	/*
	 * Formating InputString to TimeFormat
	 */
	public static Date formatTime(String inTime) {
		DateFormat formatHour = new SimpleDateFormat("HH:mm");
		Date tmpDate = null;

		try{ 
			formatHour.setTimeZone(TimeZone.getTimeZone("CEST"));
			tmpDate = formatHour.parse(inTime);		
		 return tmpDate;
		 } 
		 catch (Exception ex) {
			 System.out.println("[ERROR  ]:" + ex);				
		 return null;
		 }
	}
	
	public static int countHours() {
		
		int countHours = 0;
		int count = 0;

		Calendar outTime = new GregorianCalendar();
		outTime.setTime(formatTime("08:50"));
		Calendar inTime = new GregorianCalendar();
		inTime.setTime(formatTime("08:00"));
		Calendar bTime = new GregorianCalendar();
		bTime.setTime(formatTime("01:10"));

		long diffMillis = outTime.getTimeInMillis() - inTime.getTimeInMillis() - bTime.getTimeInMillis();
		long diffMins = diffMillis/(60*1000);
			
		return (int)diffMins;
	}
}
Code:
import java.util.Date;

public class TestDateTime{
	
	private Date test;
	
	public TestDateTime() {
		
		test = FormatDateTime.formatDate("01.10.2005");
		
		System.out.println("FormatDateTime: " + test);
		
		System.out.println(FormatDateTime.countHours());
	}
	
	public static void main( String[] args ){
		TestDateTime test = new TestDateTime();
	} 
}

Da kommt -20 raus!
 

freez

Top Contributor
Oh Danke, werde ich gleich testen.

Ich habe mir auch gedanken gemacht. Ich hatte Anfangs es so lösen wollen, daß ich jeden einzelnen Wert für Stunde, Minute und Sekunde ausrechne. Naja, da gibt es so viele Sachen zu beachten, wenn man über die 60 kommt und unter die 0. Das ist net einfach. Aber ich habe ja bei dir das Beispiel gesehen, daß du mit Millisekunden rechnest. Mache ich jetzt genauso. Ich rechne mir die Zeit in Sekunden um, mache meine Operationen (plus/minus), und wandle sie wieder um zu 3 einzelnen IntegerWerten. Zum Schluss noch abfragen, ob ein Wert negativ ist, weill ja die ganze Zeit dann negativ ist, ein entsprechendes Flag gesetzt, und schon funktionierts. Trotz der späten Stunde :)

Ich habe eine Klasse entwickelt, die recht einfach zu handhaben ist. Man übergibt ihr die Werte für die Stunden, Minuten und Sekunden, legt noch mit ner boolean fest, obs negativ oder positiv ist, und kann dann mit plus() und minus() rechnen.

Es werden zusätzlich noch die übergebenen Werte überprüft, ob sie im Wertebereich liegen (NumberFormatException fliegt im Fehlerfall).

So, und hier der Code (wäre schön, wenn mal jemand testet, was ich da verzapft habe :):

Code:
/*
 * Erstellt am 30.09.2005 19:45:34 
 *
 */

/**
 * @author oxis
 *
 */
public class TimeCalculator
{
	int Stunde = 0;
	int Minute = 0;
	int Sekunde = 0;
	boolean negative = false;

	/**
	 * @param stunde
	 * @param minute
	 * @param sekunde
	 * @throws DataFormatException
	 */
	public TimeCalculator(int stunde, int minute, int sekunde, boolean negative) throws NumberFormatException
	{
		super();
		Stunde = stunde;
		Minute = minute;
		Sekunde = sekunde;
		this.negative = negative;
		check();		
	}
	/**
	 * @throws DataFormatException
	 * 
	 */
	private void check() throws NumberFormatException
	{
		//Überprüfen, ob alle Werte im richtigen Bereich liegen
		if(this.Minute >= 60 || this.Minute < 0)
			throw new NumberFormatException("Minute ist ausserhalb des Wertebereichs 0 - 60 ... negative Werte bitte mit dem Flag 'negative' angeben");
		if(this.Sekunde >= 60 || this.Sekunde < 0)
			throw new NumberFormatException("Sekunde ist ausserhalb des Wertebereichs 0 - 60 ... negative Werte bitte mit dem Flag 'negative' angeben");
		if(this.Stunde < 0)
			throw new NumberFormatException("Stunde ist ausserhalb des Wertebereichs größer 0 ... negative Werte bitte mit dem Flag 'negative' angeben");
	}
	/**
	 * @param stunde
	 * @param minute
	 * @throws DataFormatException
	 */
	public TimeCalculator(int stunde, int minute, boolean negative) throws NumberFormatException
	{
		super();
		this.Stunde = stunde;
		this.Minute = minute;
		this.negative = negative;
		check();
	}
	/**
	 * @param stunde
	 * @throws DataFormatException
	 */
	public TimeCalculator(int stunde, boolean negative) throws NumberFormatException
	{
		super();
		this.Stunde = stunde;
		this.negative = negative;
		check();
	}
	public int getMinute()
	{
		return this.Minute;
	}
	public void setMinute(int minute) throws NumberFormatException
	{
		this.Minute = minute;
		check();
	}
	public int getSekunde()
	{
		return this.Sekunde;
	}
	public void setSekunde(int sekunde) throws NumberFormatException
	{
		this.Sekunde = sekunde;
		check();
	}
	public int getStunde()
	{
		return this.Stunde;
	}
	public void setStunde(int stunde) throws NumberFormatException
	{
		this.Stunde = stunde;
		check();
	}
	/**
	 * 
	 */
	public TimeCalculator()
	{
		super();		
	}

	public static void main(String[] args)
	{
		TimeCalculator tc1;
		TimeCalculator tc2;
		TimeCalculator tc3;
		try
		{
			tc1 = new TimeCalculator(10,30,0, false);
			tc2 = new TimeCalculator(10,50,0, false);
			tc3 = new TimeCalculator(11,30,0, false);
			tc1.plus(tc2);					//Addition
			System.out.println(tc1);
			tc2.minus(tc3);				//subtraktion
			System.out.println(tc2);
		}
		catch (NumberFormatException e)
		{
			e.printStackTrace();
		}

	}
	
	public TimeCalculator plus(TimeCalculator tc)
	{
		//zuerst alles in Sekunden errechnen
		long first = this.Stunde * 60 * 60 + this.Minute * 60 + this.Sekunde;
		long second = tc.getStunde() * 60 * 60 + tc.getMinute() * 60 + tc.getSekunde();
		
		//Abfragen, ob negativer Zeitwert
		if(tc.isNegative())
			second = second * (-1);
		if(this.isNegative())
			first = first * (-1);
		
		//ausrechnen
		long third = first + second;

		//und wieder auf die einzelnen Werte aufsplitten
		this.Stunde = (int)(third / (60*60));
		third = third % (60*60);
		this.Minute = (int)(third / 60);
		third = third % 60;
		this.Sekunde = (int)third;

		this.setNegative(false);
		//haben wir negative Werte? Wenn ja, umdrehen, und das Flag für negativ setzen
		if(this.Stunde < 0)
		{
			negative = true;
			Stunde = Stunde * (-1);
		}
		if(this.Minute < 0)
		{
			negative = true;
			this.Minute = this.Minute * (-1);
		}
		if(this.Sekunde < 0)
		{
			negative = true;
			this.Sekunde = this.Sekunde * (-1);
		}
		
		return this;
	}
	
	public TimeCalculator minus(TimeCalculator tc)
	{
		try
		{
			//aus y-x wird y+(-x) ... mathematisch korrekt, und hier funktioniert es genauso
			tc.setNegative(!tc.isNegative());
			TimeCalculator t = this.plus(tc);
			return t;
		}
		catch (NumberFormatException e)
		{
			e.printStackTrace();
			return null;
		}
	}

	public static TimeCalculator plus(TimeCalculator tc1, TimeCalculator tc2)
	{
		return tc1.plus(tc2);
		
	}
	
	public static TimeCalculator minus(TimeCalculator tc1, TimeCalculator tc2)
	{
		return tc1.minus(tc2);
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString()
	{
		//Ausgabe
		String std, min, sek;
		if(this.Stunde <= 9)
			std = "0" + this.Stunde;
		else
			std = "" + this.Stunde;
		
		if(this.Minute <= 9)
			min = "0" + this.Minute;
		else
			min = "" + this.Minute;
		
		if(this.Sekunde <= 9)
			sek = "0" + this.Sekunde;
		else
			sek = "" + this.Sekunde;
		String zeile = std + ":" + min + ":" + sek;
		
		if(this.isNegative())
			return "- " + zeile;
		else
			return zeile;
	}
	/**
	 * @return Returns the negative.
	 */
	public boolean isNegative()
	{
		return negative;
	}
	/**
	 * @param negative The negative to set.
	 */
	public void setNegative(boolean negative)
	{
		this.negative = negative;
	}
}
 

spidermobile

Bekanntes Mitglied
Hallo freez,

sieht ja nach jeder Menge Arbeit aus. Aber :roll: was spricht gegen meinen Ansatz. Kommt das nicht das gleiche raus? Der Gregorian Calendar nimmt Dir doch alles ab. Nimm den String aus deiner Eingabe, konvertiere es (formatTime) und dann ab in den GregoranCalendar. Fertig !
 

freez

Top Contributor
Naja, so viel war es nicht. Die plus() und minus() hat die meiste Denkarbeit in Anspruch genommen. Der Rest ließ sich zusammenklicken.
Ich habe deinen Ansatz noch nicht testen können. Mit dem Gregorian hatte ich eben das Problem gehabt, daß er mir keine Zeit im Minus angezeigt hatte. Macht ja nach einer normalen Uhrzeit auch Sinn. Aber für eine Zeitdifferenz eben nicht. Nun, wie gesagt, deine Version habe ich nicht getestet. Also danke erst mal für die Mühe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Zeit Optimierung - bzw. ms Optimierung Allgemeine Java-Themen 35
J Message Box soll bei bestimmter Zeit angezeigt werden Allgemeine Java-Themen 19
K CET-Zeit benutzen Allgemeine Java-Themen 6
K Geschätze Zeit implementieren Allgemeine Java-Themen 14
Blender3D AWT Fehlerhafte Zeit bei Calender und Date DateFormat Allgemeine Java-Themen 8
2 Joda Time - Localtime mit anderer Zeit vergleichen? Allgemeine Java-Themen 1
O Java Hardware Software Zeit Allgemeine Java-Themen 7
H Bestimmte Aufgaben zur bestimmter Zeit/ in bestimmten Intervallen Allgemeine Java-Themen 3
F Zeit ermitteln Allgemeine Java-Themen 2
Q Zeit in GUI selbst aktualisieren Allgemeine Java-Themen 5
D Klassen Zeit aus NMEA-Stream in SimpleDateFormat Allgemeine Java-Themen 17
M AudioClip in Spiel mehrfach in kurzer Zeit abspielen Allgemeine Java-Themen 3
N java.util.Date - Zeit auf 00:00 setzen Allgemeine Java-Themen 3
R Raum und Zeit Allgemeine Java-Themen 11
S Zeit Allgemeine Java-Themen 4
Z zeit zwischen maus drücken und loslassen Allgemeine Java-Themen 7
T Methodenparameter zur Compile-Zeit überprüfen Allgemeine Java-Themen 8
J Lizenz auf Zeit Allgemeine Java-Themen 8
X Codeabarbeitung innerhalb des Hauptprogramms für bestimmte Zeit unterbrechen Allgemeine Java-Themen 2
prakdi Zeit zum Durchlauf der Schleifen unverständlich!? Allgemeine Java-Themen 3
A JavaVM Zeit Windows 7 Allgemeine Java-Themen 9
T Zeit von einem Server/Webseite auslesen und in eigener GUI anzeigen Allgemeine Java-Themen 6
C Leerzeilen verbrauchen Zeit! Allgemeine Java-Themen 5
J Datum und Zeit Allgemeine Java-Themen 4
data89 Zeit-Diagramm erstellen Allgemeine Java-Themen 11
G JComboBox getSelectedItem Zeit Allgemeine Java-Themen 5
Kr0e Sekunden -> Zeit Allgemeine Java-Themen 14
T Mit Datum und Zeit rechnen Allgemeine Java-Themen 8
B System CPU Zeit / Last auslesen Allgemeine Java-Themen 2
J zeit überscheidungen ermitteln Allgemeine Java-Themen 6
P Thread Demonstrationr eist durch die Zeit Allgemeine Java-Themen 4
A Compilierdatum/Zeit in Code eingenerieren Allgemeine Java-Themen 13
Kidao Wie ordne ich die aktuelle Zeit in einer Zeitreihe eine? Allgemeine Java-Themen 6
J zeit stoppen Allgemeine Java-Themen 11
M Zeit eines rechners im netzwerk ermitteln Allgemeine Java-Themen 6
B Aktuelle Zeit im Format YYYY-MM-DD HH-MM-SS in Logfile schre Allgemeine Java-Themen 8
C Umrechnung der Zeit Allgemeine Java-Themen 8
B 2 JList instanzen wo nur einer zur selben Zeit selektierbar? Allgemeine Java-Themen 8
I Thread eine bestimmte Zeit zur Ausführung geben Allgemeine Java-Themen 2
P Zeit messen Allgemeine Java-Themen 16
M Zeit läuft rückwärts Allgemeine Java-Themen 3
K Thread Safe Zeit Messung Allgemeine Java-Themen 2
D Programmunterbrechung für eine bestimmte Zeit (Millisikunden Allgemeine Java-Themen 10
K ServerSocket benötigt unmengen an Zeit Allgemeine Java-Themen 7
D Zeit messen Allgemeine Java-Themen 2
G try auf zeit Allgemeine Java-Themen 8
R Garbage Collector rennt die ganze Zeit Allgemeine Java-Themen 7
M Fortschritt: verbleibende Zeit errechen. Allgemeine Java-Themen 2
F vergangene Zeit berechnen Allgemeine Java-Themen 6
A Unix Zeit Allgemeine Java-Themen 2
D Datum und Zeit - Date, Calendar oder GregorianCalender ? Allgemeine Java-Themen 13
X Parameter bei Start über Batch-Datei übergeben(Tag und Zeit) Allgemeine Java-Themen 3
C Vergangene Zeit seit Anwendungsstart messen Allgemeine Java-Themen 5
T Zeit aufaddieren Allgemeine Java-Themen 3
T zeit in java Allgemeine Java-Themen 4
Lars201 Rennteam gehalt errechnen. Allgemeine Java-Themen 2
M Anzahl der Durchläufe einer Funktion errechnen Allgemeine Java-Themen 6
H Differenz Tage errechnen Allgemeine Java-Themen 2
R Hexa Dezimalcode Errechnen Allgemeine Java-Themen 4
kodela GregorianCalendar.getTimeInMillis() Allgemeine Java-Themen 19
B SimpleDateFormat oder doch lieber GregorianCalendar Allgemeine Java-Themen 3
kodela Eigenartige Datumsberechnung über GregorianCalendar Allgemeine Java-Themen 15
Q GregorianCalendar Methode add liefert komische Werte Allgemeine Java-Themen 3
E GregorianCalendar Wochentag Allgemeine Java-Themen 3
P Fehler im GregorianCalendar Allgemeine Java-Themen 8
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
M Problem mit dem GregorianCalendar Allgemeine Java-Themen 2
J GregorianCalendar wil nich so recht as ick wol will Allgemeine Java-Themen 6
T GregorianCalendar - kein Februar Allgemeine Java-Themen 6
L Probleme mit GregorianCalendar Allgemeine Java-Themen 4
C Calendar bzw. GregorianCalendar Klasse Allgemeine Java-Themen 12
M Seltsamer Fehler bei GregorianCalendar Allgemeine Java-Themen 2
T KW=1 Jahr=2008 Monat=Dezember => GregorianCalendar Allgemeine Java-Themen 8
B GregorianCalendar UNIX Allgemeine Java-Themen 6
ARadauer GregorianCalendar Allgemeine Java-Themen 8
A Verständnisproblem mit GregorianCalendar Allgemeine Java-Themen 10
A Fehler bei Rechnung mit GregorianCalendar Allgemeine Java-Themen 6
D GregorianCalendar std zurück Allgemeine Java-Themen 7
F GregorianCalendar wirft keine Fehler bei z.b. Monat 17 Allgemeine Java-Themen 3
N GregorianCalendar Allgemeine Java-Themen 2
L String ==> Date ==> GregorianCalendar Allgemeine Java-Themen 3
F Datum in GregorianCalendar Allgemeine Java-Themen 3
N Unterschied Calendar und GregorianCalendar Allgemeine Java-Themen 9
S GregorianCalendar.getInstance() Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben