Das ist der harte Weg, und diese java.util.Date
Setter-Methoden sind seit Java 1.1 (1997) veraltet. Formatieren Sie das Datum einfach SimpleDateFormat
mit einem Formatmuster, das mit der Eingabezeichenfolge übereinstimmt .
In Ihrem speziellen Fall von "2. Januar 2010" als Eingabezeichenfolge:
- "Januar" ist der Volltextmonat, verwenden Sie also das
MMMM
Muster dafür
- "2" ist der kurze Tag des Monats, verwenden Sie also das
d
Muster dafür.
- "2010" ist das 4-stellige Jahr, verwenden Sie also das
yyyy
Muster dafür.
String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010
Beachten Sie die Wichtigkeit des expliziten Locale
Arguments. Wenn Sie es weglassen, wird das Standardgebietsschema verwendet, das nicht unbedingt Englisch ist, wie im Monatsnamen der Eingabezeichenfolge verwendet. Wenn das Gebietsschema nicht mit der Eingabezeichenfolge übereinstimmt, erhalten Sie verwirrenderweise eine java.text.ParseException
, obwohl das Formatmuster gültig erscheint.
Hier ist ein relevanter Auszug aus dem Javadoc , in dem alle verfügbaren Formatmuster aufgelistet sind:
Letter Date or Time Component Presentation Examples
------ ---------------------- ------------------ -------------------------------------
G Era designator Text AD
y Year Year 1996; 96
Y Week year Year 2009; 09
M/L Month in year Month July; Jul; 07
w Week in year Number 27
W Week in month Number 2
D Day in year Number 189
d Day in month Number 10
F Day of week in month Number 2
E Day in week Text Tuesday; Tue
u Day number of week Number 1
a Am/pm marker Text PM
H Hour in day (0-23) Number 0
k Hour in day (1-24) Number 24
K Hour in am/pm (0-11) Number 0
h Hour in am/pm (1-12) Number 12
m Minute in hour Number 30
s Second in minute Number 55
S Millisecond Number 978
z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
Z Time zone RFC 822 time zone -0800
X Time zone ISO 8601 time zone -08; -0800; -08:00
Beachten Sie, dass bei den Mustern zwischen Groß- und Kleinschreibung unterschieden wird und dass textbasierte Muster mit vier oder mehr Zeichen die vollständige Form darstellen. Andernfalls wird eine kurze oder abgekürzte Form verwendet, sofern verfügbar. Also zB MMMMM
oder mehr ist unnötig.
Hier sind einige Beispiele für gültige SimpleDateFormat
Muster zum Parsen einer bestimmten Zeichenfolge bis heute:
Input string Pattern
------------------------------------ ----------------------------
2001.07.04 AD at 12:08:56 PDT yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01 EEE, MMM d, ''yy
12:08 PM h:mm a
12 o'clock PM, Pacific Daylight Time hh 'o''clock' a, zzzz
0:08 PM, PDT K:mm a, z
02001.July.04 AD 12:08 PM yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700 EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700 yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700 yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3 YYYY-'W'ww-u
Ein wichtiger Hinweis ist , dass SimpleDateFormat
ist nicht Thread - sicher. Mit anderen Worten, Sie sollten es niemals als statische oder Instanzvariable deklarieren und zuweisen und es dann aus verschiedenen Methoden / Threads wiederverwenden. Sie sollten es immer brandneu im lokalen Bereich der Methode erstellen.
Java 8 Update
Wenn Sie sich unter Java 8 oder höher befinden, verwenden Sie DateTimeFormatter
(klicken Sie auch hier auf den Link, um alle vordefinierten Formatierer und verfügbaren Formatmuster anzuzeigen. Das Lernprogramm finden Sie hier ). Diese neue API ist von JodaTime inspiriert .
String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02
Hinweis: Wenn Ihr Formatmuster auch den Zeitteil enthält, verwenden Sie LocalDateTime#parse(text, formatter)
anstelle von LocalDate#parse(text, formatter)
. Wenn Ihr Formatmuster zufällig auch die Zeitzone enthält, verwenden Sie ZonedDateTime#parse(text, formatter)
stattdessen.
Hier ist ein relevanter Auszug aus dem Javadoc , in dem alle verfügbaren Formatmuster aufgelistet sind:
Symbol Meaning Presentation Examples
------ -------------------------- ------------ ----------------------------------------------
G era text AD; Anno Domini; A
u year year 2004; 04
y year-of-era year 2004; 04
D day-of-year number 189
M/L month-of-year number/text 7; 07; Jul; July; J
d day-of-month number 10
Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter
Y week-based-year year 1996; 96
w week-of-week-based-year number 27
W week-of-month number 4
E day-of-week text Tue; Tuesday; T
e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T
F week-of-month number 3
a am-pm-of-day text PM
h clock-hour-of-am-pm (1-12) number 12
K hour-of-am-pm (0-11) number 0
k clock-hour-of-am-pm (1-24) number 0
H hour-of-day (0-23) number 0
m minute-of-hour number 30
s second-of-minute number 55
S fraction-of-second fraction 978
A milli-of-day number 1234
n nano-of-second number 987654321
N nano-of-day number 1234000000
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
Beachten Sie, dass es mehrere vordefinierte Formatierer für die gängigsten Muster gibt. Also statt zB DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
könnten Sie verwenden DateTimeFormatter.RFC_1123_DATE_TIME
. Dies ist möglich, weil sie im Gegensatz dazu SimpleDateFormat
threadsicher sind. Sie können also bei Bedarf auch Ihre eigenen definieren.
Für ein bestimmtes Eingabezeichenfolgenformat müssen Sie kein explizites Format verwenden DateTimeFormatter
: Ein Standarddatum nach ISO 8601 , wie z. B. 2016-09-26T17: 44: 57Z, kann direkt analysiert werden, LocalDateTime#parse(text)
da es bereits den ISO_LOCAL_DATE_TIME
Formatierer verwendet. In ähnlicher Weise wird LocalDate#parse(text)
ein ISO-Datum ohne die Zeitkomponente analysiert (siehe ISO_LOCAL_DATE
) und ZonedDateTime#parse(text)
ein ISO-Datum mit einem hinzugefügten Versatz und einer hinzugefügten Zeitzone (siehe ISO_ZONED_DATE_TIME
).