Eine Anleitung zu SimpleDateFormat

Eine Anleitung zu SimpleDateFormat

1. Einführung

In diesem Tutorial nehmen wirin-depth tour of the SimpleDateFormat class.

Wir werden unssimple instantiationand formatting styles sowie nützliche Methoden ansehen, die die Klasse fürhandling locales and time zones verfügbar macht.

Bevor wir beginnen, sollten Sie bedenken, dassSimpleDateFormat nicht threadsicher ist. Daher ist es den Entwicklern überlassen, in gleichzeitigen Umgebungen angemessene Vorsichtsmaßnahmen zu treffen.

2. Einfache Instanziierung

Schauen wir uns zunächst an, wie ein neuesSimpleDateFormat -Objekt instanziiert wird.

Es gibt4 possible constructors - aber im Einklang mit dem Namen lassen Sie uns die Dinge einfach halten. Alles was wir brauchen, um loszulegen, ist einString representation of a date pattern we want.

Beginnen wir mit einem durch Striche getrennten Datumsmuster wie folgt:

"dd-MM-yyyy"

Dadurch wird ein Datum korrekt formatiert, das mit dem aktuellen Tag des Monats, dem aktuellen Monat des Jahres und schließlich dem aktuellen Jahr beginnt. Wir können unseren neuen Formatierer mit einem einfachen Unit-Test testen. Wir werden ein neuesSimpleDateFormat -Objekt instanziieren und ein bekanntes Datum übergeben:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
assertEquals("24-05-1977", formatter.format(new Date(233345223232L)));

Im obigen Code konvertiertformatter Millisekunden alslong in ein vom Menschen lesbares Datum - den 24. Mai 1977.

2.1. Fabrikmethoden

ObwohlSimpleDateFormat eine praktische Klasse ist, um schnell einen Datumsformatierer zu erstellen,we’re encouraged to use the factory methods on the DateFormat classgetDateFormat(),getDateTimeFormat(),getTimeFormat().

Das obige Beispiel sieht bei Verwendung dieser Factory-Methoden etwas anders aus:

DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
assertEquals("5/24/77", formatter.format(new Date(233345223232L)));

Wie wir oben sehen können, wird die Anzahl der Formatierungsoptionen durchfields on the DateFormat class vorgegeben. Dies ist größtenteilsrestricts our available options for formatting, weshalb wir uns in diesem Artikel anSimpleDateFormat halten.

3. Daten analysieren

MitSimpleDateFormat andDateFormat Rotz können wir nur Datumsangaben formatieren, aber wir können den Vorgang auch umkehren. Mit derparse method können wirinput the String representation of a date and return the Date ein Objektäquivalent erstellen:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date myDate = new Date(233276400000L);
Date parsedDate = formatter.parse("24-05-1977");
assertEquals(myDate.getTime(), parsedDate.getTime());

Hierbei ist zu beachten, dasspattern supplied in the constructor should be in the same format as the date parseddie Methodeparse verwendet.


4. Datums- / Uhrzeitmuster

SimpleDateFormat bietet beim Formatieren von Datumsangaben eine Vielzahl verschiedener Optionen. Während die vollständige Liste inJavaDocs verfügbar ist, wollen wir einige der am häufigsten verwendeten Optionen untersuchen:

Brief

Datumskomponente

Beispiel

M

Monat

12; Dez.

y

year

94

d

day

23; Mo.

H

hour

03

m

Minute

57

Dieoutput returned by the date component also depends heavily on the number of characters used innerhalb derString. Nehmen wir zum Beispiel den Monat Juni. Wenn wir die Datumszeichenfolge wie folgt definieren:

"MM"

Dann erscheint unser Ergebnis als Zahlencode - 06. Wenn wir jedoch ein weiteres M zu unserer Datumszeichenfolge hinzufügen:

"MMM"

Dann erscheint unser resultierendes formatiertes Datum als das WortJun.

5. Gebietsschemas anwenden

DieSimpleDateFormat -Skala auchsupports a wide range of locales, die beim Aufruf des Konstruktors festgelegt wird.

Lassen Sie uns dies in die Praxis umsetzen, indem Sie ein Datum auf Französisch formatieren. Wir werden einSimpleDateFormat -Objekt instanziieren, während wirLocale.FRANCE an den Konstruktor liefern.

SimpleDateFormat franceDateFormatter = new SimpleDateFormat("EEEEE dd-MMMMMMM-yyyy", Locale.FRANCE);
Date myWednesday = new Date(1539341312904L);
assertTrue(franceDateFormatter.format(myWednesday).startsWith("vendredi"));

Indem wir ein bestimmtes Datum, einen Mittwochnachmittag, angeben, können wir behaupten, dass unserfranceDateFormatter das Datum korrekt formatiert hat. Das neue Datum beginnt korrekt mitVendredi -French für Mittwoch!

Es ist erwähnenswert, ein wenig Gotcha inLocale version of the constructor -whilst many locales are supported, full coverage is not guaranteed zu erwähnen. Oracle empfiehlt, die Factory-Methoden fürDateFormat zu verwenden, um die Abdeckung des Gebietsschemas sicherzustellen.

6. Zeitzonen ändern

DaSimpleDateFormat dieDateFormat -Skala erweitert, können wir auchmanipulate the time zone using the setTimeZone method. Schauen wir uns das in Aktion an:

Date now = new Date();

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE dd-MMM-yy HH:mm:ssZ");

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
logger.info(simpleDateFormat.format(now));

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
logger.info(simpleDateFormat.format(now));

Im obigen Beispiel liefern wir dasselbeDate für zwei verschiedene Zeitzonen für dasselbeSimpleDateFormat-Objekt. Wir haben auch die‘Z' character to the end of the pattern String to indicate the time zone differences hinzugefügt. Die Ausgabe derformat method wird dann für den Benutzer protokolliert.

Wenn Sie auf run klicken, werden die aktuellen Zeiten für die beiden Zeitzonen angezeigt:

INFO: Friday 12-Oct-18 12:46:14+0100
INFO: Friday 12-Oct-18 07:46:14-0400

7. Zusammenfassung

In diesem Tutorial haben wir uns eingehend mit den Feinheiten vonSimpleDateFormat befasst.

Wir haben uns angesehen, wieinstantiate SimpleDateFormat as und wiepattern String impacts how the date is formatted.

Wir haben mitchanging the locales des Ausgabe-Strings herumgespielt, bevor wir schließlich mitusing time zones experimentiert haben.

Wie immer kann der vollständige Quellcodeover on Github gefunden werden.