# Calendar bzw. GregorianCalendar Klasse



## chehilbi (23. Mrz 2009)

Hallo zusammen,

ich verzweifele gerade an der Calendar bzw. GregorianCalender Klasse. Ich erzeuge zwe GregorianCalendar
Objekte. Dem timestamp Objekt weisse ich eine feste Sekundenanzahl zu mit Hilfe des zweiten Objektes.
Danach mach ich ein sleep von 5 Sek und geben die beiden Sekundenzahlen aus. Beide sind seltsamerweise
gleich. Das kann doch nicht sein. Die Sekunden vom cal Objekt müssten doch 5 Sek weiter fortgeschritten sein.
Sinn und Zweck soll eine Art Timestamp sein. Kann mir jemand helfe? Danke!

[HIGHLIGHT="Java"]Calendar timestamp = new GregorianCalendar();
Calendar cal = new GregorianCalendar();

timestamp.set(Calendar.SECOND, cal.get(Calendar.SECOND));

try {
	Thread.sleep(5000);
}
catch(Exception e) {
	System.out.println(e);
}

System.out.println("timestamp:" + timestamp.get(Calendar.SECOND));
System.out.println("aktuelle Zeit:" + cal.get(Calendar.SECOND));[/HIGHLIGHT]
folgende Ausgabe:


```
timestamp:40
aktuelle Zeit:40
```


----------



## Sempah (23. Mrz 2009)

Ich glaube er nimmt die Zeit (Sekunden), wo das GregorianCalendar Objekt instanziiert wird.
Versuch mal folgendes:


```
GregorianCalendar cal1 = new GregorianCalendar();
		System.out.println(cal1.get(Calendar.SECOND));

		try {
			Thread.sleep(2000);
		} catch (Exception e) {
			System.out.println(e);
		}

		GregorianCalendar cal2 = new GregorianCalendar();
		System.out.println(cal2.get(Calendar.SECOND));
```


----------



## chehilbi (23. Mrz 2009)

ich denke du hast recht. Die Uhrzeit wird beim initialisieren des Objektes gesetzt. Dann ist es ja gar 
nicht möglich mit nur einem Objekt, immer wieder die aktuelle Uhrzeit abzurufen. Ist das möglich. 
Oder gibt es eine Methode um die Uhrzeit neu zu laden?

[HIGHLIGHT="Java"]GregorianCalendar cal1 = new GregorianCalendar();
System.out.println(cal1.get(Calendar.SECOND));

try {
	Thread.sleep(3000);
} catch (Exception e) {
	System.out.println(e);
}

GregorianCalendar cal2 = new GregorianCalendar();
System.out.println(cal2.get(Calendar.SECOND));

System.out.println(cal1.get(Calendar.SECOND));[/HIGHLIGHT]
Ausgabe:


```
55
58
55
```


----------



## benders (23. Mrz 2009)

Ja,

cal.setTime(new Date()); //Erzeugt leider immer in neues Date-Object

daher halte ich es für besser:

cal.setTimeInMillis(System.currentTimeLillis())
zu benutzen.


Bernd


----------



## chehilbi (23. Mrz 2009)

was ich jetzt noch nicht ganz verstehe ist die Vererungsstruktur von GreogoriaCalendar. Gregorian 
Calendar erbt ja von der abstrakten Klasse Calendar. Wenn man sich den folgende Link anschaut, 
sieht man in der Klasse Calendar eine Vielzahl von static Attributen und Methonden die vererbt werden. 

Class java.util.Calendar

Wenn diese static sind, wie können dann die GregorianCalendar unterschiedelich Werte annehmen???


----------



## SlaterB (23. Mrz 2009)

statische Methoden werden nicht vererbt, nehmen nicht 'unterschiedliche Werte an',
wie kommst du zu dieser Annahme?


----------



## chehilbi (23. Mrz 2009)

also static methoden und attribute werden nicht vererbt  wie peinlich, dass kommt davon wenn man ein halbes jahr c prozedual programmiert


----------



## Wildcard (23. Mrz 2009)

Wenn du nur einen Timestamp ausgeben willst, warum dann der Calendar? System.currentTimeMillis() und System.nanoTime()


----------



## chehilbi (24. Mrz 2009)

würde natürlich auch gehe, aber mit dem Calendar kann ich das Datum in jedem gewünschten Format darstellen bzw. weitergeben z.B. an eine DB!

System.out.println(System.currentTimeMillis());


----------



## Wildcard (24. Mrz 2009)

Dafür reicht SimpleDateFormat und Date.


----------



## ARadauer (24. Mrz 2009)

bzw. weitergeben z.B. an eine DB!... wops nein!

```
GregorianCalendar cal = null; //was auch immer
      
      Connection con = null; //was auch immer
      PreparedStatement smt = con.prepareStatement("dein query mit ? wo das datum hin gehört");
      smt.setDate(1, new java.sql.Date(cal.getTime().getTime()));
```
besser prepared statemens verwenden...


----------



## Ebenius (24. Mrz 2009)

Kurz noch die Faustregeln: 
java.util.Date zum festhalten eines konkreten Datums mit Uhrzeit
System.currentTimeMillis(), System.nanoTime(), new Date() zum abfragen der aktuellen Zeit
DateFormat, SimpleDateFormat, MessageFormat zum formatieren von Daten
Calendar (normaler Weise nicht explizit: GregorianCalendar) zum Modifizieren eines Datums nach Kalender-Regeln (eine Woche vor, 3 Tage zurück, Minuten auf null setzen, ...)
Ebenius


----------



## chehilbi (24. Mrz 2009)

die Faustregeln klingen wirklich gut! Danke!


----------

