Die Verwendung von java.util.Date und dem java.text.SimpleDateFormat in Java

06.10.2012

Die Verwendung von java.util.Date und dem java.text.SimpleDateFormat in Java

Hier wird beschrieben, wie man eine Datums und Zeitangabe, die in einem String gespeichert ist, in ein Objekt von Type Date umwandelt, bzw. einliest. Anschließend soll das Datum in einem anderen Format wieder ausgegeben werden. Es geht also um das Parsen eines Datum-Strings und das anschließende Umformatieren der Zeitangabe.

Ich sehe regelmäßig sehr interessante und phantasievolle Ansätze, wie Leute mit Datumsangaben in Java umgehen. Oft wird das Datum einfach ignoriert, d.h. direkt in einen String umgewandelt und gehofft, dass das Format "schon" passt. Andere Personen fangen an das Datum innerhalb des Strings zu parsen und mit String.substring(int start, int end) auseinander zu bauen, um es anschließend in der Konstruktor von Date(String date) oder die Methode Date.parse(String date) zu stecken. Glücklicherweise sind diese beiden Möglichkeiten inzwischen als deprecated markiert.

Der richtige Weg geht natürlich über die Klasse java.text.SimpleDateFormat. Als Beispiel dient ein String mit dem Wert Wed, 31 Oct 2012 22:05:06 +0000, der als erstes in einen Objekt von Type Date abgelegt und anschließend umformatiert auf der Konsole ausgegeben werden soll. Beispielsweise so: 31.10.2012 22:05:06 - Mittwoch. Zu beachten ist dabei, dass sowohl das Format als auch das Locale umgestellt werden.

Wie man an den Eingangsdaten sieht, handelt es sich um ein "amerikanisches" Datumsformat. Also muss die Locale.US verwendet werden. Die Formatangabe für das Datum setzt sich folgendermassen zusammen:

Abk.BeschreibungTypeBeispielwertBeispiele
GEra designatorTextAD"GG" -> "AD"
yYearYear2012;12"yy" -> "12"
"yyyy" -> "2012"
MMonth in yearMonthJuly; Jul; 07"M" -> "7"
"M" -> "12"
"MM" -> "07"
"MMM" -> "Jul"
"MMMM" -> "December"
wWeek in yearNumber27"w" -> "7"
WWeek in monthNumber2"W" -> "3"
DDay in yearNumber189"D" -> "65"
"DDD" -> "065"
dDay in monthNumber10"d" -> "3"
"dd" -> "03"
FDay of week in monthNumber2"F" -> "1"
EDay in weekTextTuesday; Tue"EEE" -> "Tue"
"EEEE" -> "Tuesday"
aAm/pm markerTextPM"a" -> "AM"
"aa" -> "AM"
HHour in day (0-23)Number0"H" -> "15"
"HH" -> "15"
kHour in day (1-24)Number24"k" -> "3"
"kk" -> "03"
KHour in am/pm (0-11)Number0"K" -> "15"
"KK" -> "15"
hHour in am/pm (1-12)Number12"h" -> "3"
"hh" -> "03"
mMinute in hourNumber30"m" -> "7"
"m" -> "15"
"mm" -> "15"
sSecond in minuteNumber55"s" -> "15"
"ss" -> "15"
SMillisecondNumber978"SSS" -> "007"
zTime zone Generaltime zonePacific Standard Time; PST; GMT-08:00"z" -> "EST"
"zzz" -> "EST"
"zzzz" -> "Eastern Standard Time"
ZTime zone RFC 822time zone-0800"Z" -> "+0100"
"Single QuoteLiteral45'936"ss"SSS" -> "45'876"

Weitere Information findet man in der JavaDoc Class SimpleDateFormat.

Als erstes wird ein Objekt vom Type SimpleDateFormat erstellt. Der Konstruktor bekommt als Parameter die Formatierung der Eingangsdaten und ein Objekt vom Type DateFormatSymbol mit dem Locale.US übergeben. Anschließend wird auf dem String inputDate mit der Funktion parse ein Objekt vom Type Date erstellt. Für die Ausgabe wird ein neues SimpleDateFormat-Objekt angelegt. Das Ausgabeformat im Konstruktor wird dafür angepasst, so dass es den Anforderungen entspricht. Abschließend kann mit der Funktion format das Objekt date in dem neuen Format auf der Konsole ausgegeben werden.

String inputDate = "Wed, 31 Oct 2012 22:05:06 +0000";

//Create SimpleDateFormat with Locale.US
SimpleDateFormat format =
                new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", new DateFormatSymbols(Locale.US));

// Parse the date string
Date date = format.parse(inputDate);

// 31.10.2012 22:05:06 - Mittwoch
SimpleDateFormat outputFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss - EEEE");
String outputDate = outputFormat.format(date);

System.out.println(outputDate);

Wie man sieht, ist es gar nicht so kompliziert mit der Klasse Date und SimpleDateFormat richtig umzugehen. ;-)

Buchstaben und Zeichen im SimpleDateFormat

Wenn man im Date-Pattern des SimpleDateFormat einen Buchstaben oder ein Zahl verwenden möchte, muss das Zeichen in Hochkommas geschrieben werden.
Möchte man beispielsweise ein Ausgabeformat 2013-05-19T07:06:59Z erstellen, dann muss das SimpleDateFormat folgendermaßen aussehen: yyyy-MM-dd'T'HH:mm:ss'Z'.