Calendar-Objekt formatiert ausgeben
*jiriki*
- java
0 Daniel Thoma0 *jiriki*0 Daniel Thoma0 *jiriki*0 Daniel Thoma0 *jiriki*
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:MM:DD 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:MM:DD 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*
Hallo *jiriki*,
Die Klasse java.text.DateFormat
könnte Dir weiterhelfen.
Entweder ich hab Probleme, meine Gehirnzellen in Schwung zu bringen (weil die schon so viel Buchhaltung abgearbeitet haben) oder ich finde da keine passende Methode (format() noch am ehesten), die mich ein quasi beliebiges String-Output-Format festlegen lässt.
Greets, *jiriki*
Hallo jiriki*,
Vielleicht hätte ich Dich direkt an die Kindklasse java.text.SimpleDateFormat verweisen sollen.
DateFomat ist eine abstrakte Klasse und stellt eine allgemeine Schnittstelle für Datumsformatierung zur Verfügung.
SimpleDateFormat ist eine konkrete Implementierung, bei der man die Datumsdarstellung durch ein Muster festlegen kann.
Grüße
Daniel
Ja, sauber. Das formatieren klappt jetzt, nur anscheinend macht die Umwandlung von Calendar in Date Probleme. Nach der Umwandlung befind ich mich anscheinend immer einen Monat später.
Greets, *jiriki*
Hallo *jiriki*,
Poste doch mal den relevanten Code.
Grüße
Daniel
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 );
Grüße, *jiriki*
Hallo *jiriki*,
Du hättest evt. mal die Dokumentation von java.util.Calendar.set(...) lesen sollen ;-)
Die Monatsangabe ist Nullbasiert spricht Januar == 0, somit ist 10 der November.
Damit ist dann wohl klar, weshalb Dein Datum im November liegt.
Die Klasse DateFormat hat übrigens eine Methode parse(...)
Damit kannst Du aus einem String ein Datum erzeugen.
Das ist evt. einfacher.
Grüße
Daniel