# GregorianCalendar Zeit abziehen (Countup)



## Hobbit_Im_Blutrausch (29. Nov 2004)

Hi, ich möchte eine Art Countup bauen, bei der die Zeit berechnet wird, die seit dem eingegebenen Datum bis zum heutigen Tag vergangen ist! Und das auf Jahre, Monate, Tage, Stunden und Minuten. Das funktioniert mit GregorianCalendar soweit auch ganz gut, bis aufs Jahr! Denn wenn die Differenz der beiden Zeitpunkte weniger als ein Jahr beträgt, wird für die Jahresdifferenz trotzdem 1 angezeigt anstatt 0! Wie kann ich das lösen?


```
GregorianCalendar differenz = new GregorianCalendar();
differenz.add(Calendar.MINUTE, -minute);
differenz.add(Calendar.HOUR_OF_DAY, -stunde);
differenz.add(Calendar.DAY_OF_MONTH, -tag);
differenz.add(Calendar.MONTH, -monat);
differenz.add(Calendar.YEAR, -jahr);
```

Vielen Dank schonmal im Vorneweg für die Hilfe


----------



## DTR (29. Nov 2004)

Hallo,

ich würde mir an deine Stelle einmal ein Objekt von GregorianCalendar anlegen mit dem Ausgangsdatum und eins mit der Systemzeit. Von beiden würde ich mir die Millisekundenzahl erfragen, dafür gibt es eine Methode. Davon wiederum die Differenz bilden und damit dann wiederum eine GregorianCalendar Objekt anlegen. JEtzt musst du nurnoch beachten, das der GregorianCalendar nicht im Jahre 0 anfängt


----------



## The_S (2. Dez 2004)

Hab jetzt zum 10.000 mal die Suche benutzt und auch selbst rumversucht, aber ich bekomme es einfach nicht auf die Reihe die Millisekunden wieder in ein Datum umzuwandeln!


----------



## dotlens (2. Dez 2004)

sieh dir die konstruktoren der klasse Date an...
hier der wichtige Ausschnitt:


			
				API hat gesagt.:
			
		

> Date(long date)
> Allocates a Date object and initializes it to represent the specified number of milliseconds since the standard base time known as "the epoch", namely January 1, 1970, 00:00:00 GMT.


----------



## The_S (2. Dez 2004)

Hast du vielleicht ein Codebeispiel für mich, weil ich net weiß, wie ich des genau machen soll? Bin ja noch ein Anfänger

Gibts da vielleicht auch ne Möglichkeit mit GregorianCalendar oder Calendar und ohne Date?


----------



## dotlens (2. Dez 2004)

Calendar hat 2 methoden die dir hier helfen.
1. Date benutzen
2. direkt millis annehmen (macht mehr Sinn)



			
				API hat gesagt.:
			
		

> void 	setTime(Date date)
> Sets this Calendar's current time with the given Date.
> void 	setTimeInMillis(long millis)
> Sets this Calendar's current time from the given long value.



du solltest versuchen mit der API zu arbeiten...


----------



## The_S (2. Dez 2004)

OK, habs gerafft! Danke für deine Geduld :applaus: ! Aber blöderweiße bekomme ich nicht das richtige Ergebnis!


```
GregorianCalendar damals = new GregorianCalendar(2003, 11, 20, 19, 30);
GregorianCalendar heute = new GregorianCalendar();
long millis = heute.getTimeInMillis() - damals.getTimeInMillis();
heute.setTimeInMillis(millis);
```
Der Kalender ist nämlich immer unterschiedlich viele Tage zu bald dran, aber manchmal stimmt er sogar! Aber ansonsten stimmt auf den ersten Blick alles.


----------



## dotlens (2. Dez 2004)

sorry, aber damit kann ich nichts anfangen...
wo liegt das porblem?

bsp?
code?


----------



## The_S (2. Dez 2004)

Der Kalender zählt des öfteren einfach mal 3 Tage zu der eigentlichen Anzahl dazu! Code hab ich nicht mehr, weil ich es auf einen anderen Weg versuche! Muss nurnoch wissen wie ich bei einen double wert mit Komma in einen double (oder int) Wert ohne Komma bekomme! Dann könnte ich meine Lösung hier mal posten und das Kapitel wäre endlich mal abgeschlossen  :wink:


----------



## The_S (2. Dez 2004)

OK hier ist die Lösung:


```
int tage = 0;
int stunden = 0;
int minuten = 0;
int sekunden = 0;
GregorianCalendar damals = new GregorianCalendar(2003, 11, 20, 19, 30);
GregorianCalendar heute = new GregorianCalendar();
double diff = heute.getTimeInMillis() - damals.getTimeInMillis();
diff = diff / 1000 / 60 / 60 / 24;
double diff2 = diff % 1 * 24;
double diff3 = diff2 % 1 * 60;
double diff4 = diff3 % 1 * 60;
tage = (int)diff;
stunden = (int)diff2;
minuten = (int)diff3;
sekunden = (int)diff4;
```

Allerdings bekomme ich dann nicht die Jahre und Monate sondern nur die Tage, aber das ist in diesem Fall egal! Danke @ dotlens und DTR


----------

