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. | Beschreibung | Type | Beispielwert | Beispiele |
---|---|---|---|---|
G | Era designator | Text | AD | "GG" -> "AD" |
y | Year | Year | 2012;12 | "yy" -> "12" "yyyy" -> "2012" |
M | Month in year | Month | July; Jul; 07 | "M" -> "7" "M" -> "12" "MM" -> "07" "MMM" -> "Jul" "MMMM" -> "December" |
w | Week in year | Number | 27 | "w" -> "7" |
W | Week in month | Number | 2 | "W" -> "3" |
D | Day in year | Number | 189 | "D" -> "65" "DDD" -> "065" |
d | Day in month | Number | 10 | "d" -> "3" "dd" -> "03" |
F | Day of week in month | Number | 2 | "F" -> "1" |
E | Day in week | Text | Tuesday; Tue | "EEE" -> "Tue" "EEEE" -> "Tuesday" |
a | Am/pm marker | Text | PM | "a" -> "AM" "aa" -> "AM" |
H | Hour in day (0-23) | Number | 0 | "H" -> "15" "HH" -> "15" |
k | Hour in day (1-24) | Number | 24 | "k" -> "3" "kk" -> "03" |
K | Hour in am/pm (0-11) | Number | 0 | "K" -> "15" "KK" -> "15" |
h | Hour in am/pm (1-12) | Number | 12 | "h" -> "3" "hh" -> "03" |
m | Minute in hour | Number | 30 | "m" -> "7" "m" -> "15" "mm" -> "15" |
s | Second in minute | Number | 55 | "s" -> "15" "ss" -> "15" |
S | Millisecond | Number | 978 | "SSS" -> "007" |
z | Time zone General | time zone | Pacific Standard Time; PST; GMT-08:00 | "z" -> "EST" "zzz" -> "EST" "zzzz" -> "Eastern Standard Time" |
Z | Time zone RFC 822 | time zone | -0800 | "Z" -> "+0100" |
" | Single Quote | Literal | 45'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'
.