Wie kann ich SimpleDateFormat mit Kalender verwenden?

69

Ich habe GregorianCalendar-Instanzen und muss SimpleDateFormat verwenden (oder etwas, das mit Kalender verwendet werden kann, aber die erforderliche # fromat () -Funktion bietet), um die erforderliche Ausgabe zu erhalten. Bitte schlagen Sie Problemumgehungen sowie dauerhafte Lösungen vor.

Denys S.
quelle

Antworten:

102

Versuche dies:

Calendar cal = new GregorianCalendar();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
dateFormat.setTimeZone(cal.getTimeZone());
System.out.println(dateFormat.format(cal.getTime()));
janhink
quelle
Der fehlende Schritt aus der Antwort von JamesKingston wurde hinzugefügt. Vielen Dank!
Janhink
1
Was bewirkt es, keine Zeitzone hinzuzufügen?
Kamaci
2
@kamaci siehe die Kommentare unter JamesKingstons Antwort. Nur wichtig, wenn Sie ein Kalenderobjekt haben, das auf einer Zeitzone basiert, die sich von der Standardzeitzone des Systems unterscheidet, und Sie möchten, dass es in der Zeitzone dieses Kalenders gedruckt wird. Wenn Sie keine Zeitzone festlegen, wird die Standardsystemzeitzone verwendet. Wenn dies mit der Zeitzone des Kalenders übereinstimmt, spielt das Festlegen der Zeitzone keine Rolle. Beachten Sie, dass die Antwort von JamesKingston auch funktioniert: Wenn Sie dateFormat mitteilen, welcher Kalender verwendet werden soll, kann er die Zeitzone des Kalenders verwenden.
ToolmakerSteve
36

In der Antwort von eQui fehlt ein Schritt

Calendar cal = new GregorianCalendar();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
#---- This uses the provided calendar for the output -----
dateFormat.setCalendar(cal); 
System.out.println(dateFormat.format(cal.getTime()));
JamesKingston
quelle
1
+1, weil die Antwort die vollständigste ist. Ohne diesen Methodenaufruf wird der Standardkalender für die Formatierung verwendet. (Die Frage gab jedoch nicht wirklich an, welcher Kalender für die Formatierung verwendet werden sollte.)
Robert
2
Für diesen Fall spielt es keine Rolle, aber wenn Sie Dinge tun wollten wie: cal.setTimeZone(TimeZone.getTimeZone("GMT")); cal.setTime(new Date(record.getMillis()));es scheint zu sein.
JamesKingston
3
Entschuldigung, warum sollte jemand einen Kalender einstellen müssen, wenn er nur eine formatierte Ausgabe benötigt?
Denys S.
Um den vorherigen Kommentar von JamesKingston hervorzuheben, führt die Antwort von eQui (dh ohne dateFormat.setCalendar) zu einer falschen Ausgabe, wenn die Zeitzone von 'cal' etwas anderes als die Standardzeitzone des Systems ist. Um @ denys-s zu beantworten, geht es nicht nur um Formatierung, sondern auch um Korrektheit.
Scott Dudley
1
Ich sollte klarstellen, dass mit "Korrektheit" gemeint ist, dass ohne setCalendar der Kalender vor der Anzeige in die Standardzeitzone des Systems konvertiert wird. Dies ist wahrscheinlich nicht das, was Sie wollten (und insbesondere nicht, wenn Sie die Zeitzone nicht auflisten im Format string!). Selbst wenn Sie beispielsweise Code verwenden, um einen Kalender explizit auf 2014-05-08 festzulegen, wird er möglicherweise abhängig vom genauen Zeitzonenversatz möglicherweise als 2014-05-07 oder 2014-05-09 angezeigt.
Scott Dudley
3

Calendar.getTime () gibt ein Datum zurück, das mit SimpleDateFormat verwendet werden kann.

Reverend Gonzo
quelle
3

Rufen Sie einfach calendar.getTime()das resultierende DateObjekt auf und übergeben Sie es an die formatMethode.

Thomas
quelle