# (JAVA) Calendar-Objekt formatiert ausgeben



## *jiriki* (25. Feb 2005)

Hi, ich such jetzt schon seit Ewigkeiten, find aber keine zufriedenstellende Lösung, deswegen frag ich ma hier:

Im großen und ganzen möchte ich die zeitliche Differenz in Sekunden zwischen zwei String-Datumsangaben (YYYY:MMD HH:MM:SS) haben.
Bis jetzt bin ich so vorgegangen, dass ich beide Strings in ihre Bestandteile zerlegt habe, und diese dann in ein Calendar-Objekt eingefüttert hab (der Klasse soll ja im Gegensatz zu Date die Zukunft gehören). Dann hab ich beide Objekte in Millisekundenwerte (getTimeInMillis()) umgerechnet, die Differenz gebildet und auf Sekunden hochgerechnet und gerundet.

Sodala, soweit hab ich meine Differenz. Aus diesem Abstand der beiden Datumsangaben hab ich mir nun eine zeitliche Schrittweite errechnet, mit der ich vom einen zum anderen Calendar-Object "gehen" möchte. D.h. ich fang beim früheren Calendar-Objekt an, rechne eine Schrittweite drauf (mit add()) und hab dann nen neues Calendar-Objekt (das geht dann so lang weiter, bis ich beim andren Objekt "angekommen" bin).

Jetzt mein Problem: Ich möchte mein neu errechnetes und erstelltes Calendar-Objekt wieder in einen String vom Format "YYYY:MMD HH:MM:SS" umwandeln. Doch ich find weder in der Calendar-, noch in der Date- und deren Subklassen passende Funktionen. Mein einziger Lösungsweg wäre bisher, jeden Wert (Jahr, Monat, ...) einzeln aus dem Objekt mit get() zu ziehen, dann beim Monat noch eins draufrechnen (weil die Zählung anscheinend bei 0 anfängt), dann die Integers in Strings parsen und evtl. mit Nullen auffüllen (z.B. wenn Tag einstellig) und dann alles zu einem String zusammensetzen.

Genau diesen letzten Schritt würd ich gern verhindern. Wenn sich einer mit Zeitfunktionen in Java auskennt, bitte helfen! Grazie, *jiriki*


----------



## Beni (25. Feb 2005)

Also laut API gibts auch sonst keine Methode, welche einen Calendar umwandelt.

Du könntest es mal mit dem DateFormat versuchen. Das benötigt zwar ein Date (nein nein, da ist niergends eine Inkonsistenz...), aber sollte einen String angepasst an die Einstellungen deines OS'es liefern.


----------



## Gast (25. Feb 2005)

static GregorianCalendar differenz(GregorianCalendar min, GregorianCalendar sub){
		long t1 = min.getTimeInMillis();
		long t2 = sub.getTimeInMillis();
		Date datum = new Date(t1 - t2);
		int year = datum.getYear();
		int month = datum.getMonth();
		int date = datum.getDate();
		int hour = datum.getHours();
		int minutes = datum.getMinutes();
		int seconds = datum.getSeconds();
		return new GregorianCalendar(year, month, date, hour, minutes, seconds);
	}


----------



## *jiriki* (26. Feb 2005)

Ähm, danke, aber die Differenz hatte ich ja schon. Was ich bräuchte, wär ne Darstellung meines Calendar-Objekts als String im Format "YYYY:MMD hh:mm:ss". Mittlerweile hab ich das Formatieren mit SimpleDateFormat, ner Unterklasse von DateFormat hinbekommen, doch jetzt zeigt sich, dass es doch eine "Inkonsistenz" (@Beni) beim Überführen von Calendar- in Date-Objekt im Sinne von 

Date date = new Date( calendar.getTimeInMillis() );

macht: Im Date-Objekt ist das Datum einen Monat weiter. Hängt bestimmt damit zusammen, dass Calendar() die Monate bei 0 anfängt zu zählen, anstatt bei 1.

Bin für jede weitere Hilfe dankbar. Greets, *jiriki*


----------



## Roar (26. Feb 2005)

guck dir mal die klasse SimpleDateFormat an :autsch:


----------



## *jiriki* (26. Feb 2005)

Soll ich da auf die Antwort meiner Frage stoßen? Wenn ja, hab ichs nicht gefunden. Bitte um sachdienlichen Hinweis.  N8tle, *jiriki*


----------



## Roar (26. Feb 2005)

```
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
String schönFormatierterString = format.format(new Date( calendar.getTimeInMillis()));
```

mach ma so, ich glaub das is das was du haben willst.


----------



## *jiriki* (26. Feb 2005)

Das Formatieren mit der SimpleDateFormat-Subclass funktioniert ja schon, nur gibt es anscheinend ein Problem bei der Umwandlung von Calendar in Date-Objekt.  Kleiner Beispielcode:


```
// Casting von Start- und Endzeit in Kalender-Typ
String starttime = "2003:10:28 00:00:00";
String endtime = "2003:10:28 16:20:26";

Calendar start = Calendar.getInstance();
start.set( Integer.parseInt( starttime.substring( 0, 4 ) ), 
		Integer.parseInt( starttime.substring( 5, 7 ) ), 
		Integer.parseInt( starttime.substring( 8, 10 ) ), 
		Integer.parseInt( starttime.substring( 11, 13 ) ), 
		Integer.parseInt( starttime.substring( 14, 16 ) ), 
		Integer.parseInt( starttime.substring( 17, 19 ) ) );
Calendar end = Calendar.getInstance();
end.set( Integer.parseInt( endtime.substring( 0, 4 ) ), 
		Integer.parseInt( endtime.substring( 5, 7 ) ), 
		Integer.parseInt( endtime.substring( 8, 10 ) ), 
		Integer.parseInt( endtime.substring( 11, 13 ) ), 
		Integer.parseInt( endtime.substring( 14, 16 ) ), 
		Integer.parseInt( endtime.substring( 17, 19 ) ) );
					
// Ermittlung der Spanne und Intervallsprünge zwischen Start- und Zielzeit; Anzahl der Sprünge ergibt sich aus Länge 
// des Vectors empty; hier mal konstant auf 2 gesetzt.
long t1 = start.getTimeInMillis();
long t2 = end.getTimeInMillis();
long dist = t2 - t1;
long interval = Math.round( dist / ( 2 * 1000 ) );
					
// Hier werden mir die Millisekundenangaben t1:1069974000213, t2:1070032826213, interval:29413 zurückgegeben
System.out.println( t2+"\n"+t1+"\n"+interval );
										
// In tx wird nun die Startzeit abgelegt und ein Intervallsprung draufgerechnet, woraus sich dann die neue Zeit 
// ergeben soll (die zwischen der Start- und Endzeit liegen soll!)
long tx = t1;
int x = empty.size()+i;

// Als neues Ergebnis für tx kommt raus 1069974029626 -> korrekt; der Taschenrechner gibts gleiche aus ;)
System.out.print ( tx+" + "+interval+" = " );
tx += interval;
System.out.println ( tx );
						
SimpleDateFormat formatter = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
// Genau hier, bei der Rückwandlung der Millisekunden in Date spuckt er mir plötzlich ein Datum im November aus,
// was natürlich nicht zwischen 2003:10:28 00:00:00 und 2003:10:28 16:20:26 liegt, im Gegensatz zu den 
// zugehörigen Millisekundenzeiten
Date getdate = new Date( tx );
String string = formatter.format( getdate );
System.out.println( "Zielstring: "+string );
```

Grüße, *jiriki*


----------



## Roar (26. Feb 2005)

benutz doch die parse() methode:


```
SimpleDateFormat formatter = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
Date ende = formatter.parse("2003:10:28 00:00:00");
// und so weiter
// noch nen trycatch drum
```


----------



## *jiriki* (4. Mrz 2005)

Um den Konflikt zwischen Date() und Calendar() zu umgehen, hab ich jetzt alles in Date() berechnet.


```
// Casting von Start- und Endzeit in Kalender-Typ

SimpleDateFormat format = new SimpleDateFormat( "yyyy:MM:dd HH:mm:ss" );
Date start = format.parse( starttime );
Date end = format.parse( endtime );

// Ermittlung der Spanne und Intervallsprünge zwischen Start- und Zielzeit
long t1 = start.getTime();
long t2 = end.getTime();
long interval = Math.round( ( t2 - t1 ) / ( empty.size()+1 ) );
long tx = t1;
int x = empty.size()+i;
					
// Setzen der künstlich erzeugten Zeiten in den Bildervector
for( int h=i; h<x; h++ ) {
						
tx += interval;
						
Vector current = (Vector) pic.elementAt( h );
SimpleDateFormat formatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
Date blubb = new Date(tx);
String newdate = formatter.format( tx );
 						 						
current.setElementAt( newdate, 1);
pic.setElementAt( current, h );
						
}
```

Grüßle, Alex


----------

