È difficile, e quei java.util.Date
metodi setter sono stati deprecati da Java 1.1 (1997). Basta formattare la data utilizzando SimpleDateFormat
un modello di formattazione corrispondente alla stringa di input .
Nel tuo caso specifico di "2 gennaio 2010" come stringa di input:
- "Gennaio" è il mese di testo completo, quindi usa il
MMMM
modello per questo
- "2" è il breve giorno del mese, quindi usa lo
d
schema per questo.
- "2010" è l'anno di 4 cifre, quindi usa il
yyyy
modello per questo.
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
Nota l'importanza Locale
dell'argomento esplicito . Se lo ometti, utilizzerà le impostazioni internazionali predefinite che non sono necessariamente inglesi, come quelle usate nel nome del mese della stringa di input. Se le impostazioni internazionali non corrispondono con la stringa di input, si otterrebbe confusamente java.text.ParseException
anche se il modello di formato sembra valido.
Ecco un estratto di rilevanza dal javadoc , che elenca tutti i modelli di formato disponibili:
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
Si noti che i motivi fanno distinzione tra maiuscole e minuscole e che motivi basati su testo di quattro caratteri o più rappresentano la forma completa; in caso contrario viene utilizzata una forma abbreviata o abbreviata, se disponibile. Quindi ad esempio MMMMM
o più non è necessario.
Ecco alcuni esempi di SimpleDateFormat
schemi validi per analizzare una data stringa fino ad oggi:
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
Una nota importante è che nonSimpleDateFormat
è thread-safe. In altre parole, non dovresti mai dichiararlo e assegnarlo come variabile statica o di istanza e quindi riutilizzarlo da diversi metodi / thread. Dovresti sempre crearlo nuovo nell'ambito del metodo ambito locale.
Aggiornamento di Java 8
Se ti capita di trovarti su Java 8 o DateTimeFormatter
versioni successive, utilizza (anche qui, fai clic sul collegamento per visualizzare tutti i formattatori predefiniti e i modelli di formato disponibili; il tutorial è disponibile qui ). Questa nuova API è ispirata a JodaTime .
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
Nota: se il modello di formato contiene anche la parte temporale, utilizzare LocalDateTime#parse(text, formatter)
invece di LocalDate#parse(text, formatter)
. E, se il modello di formato contiene anche il fuso orario, utilizzare ZonedDateTime#parse(text, formatter)
invece.
Ecco un estratto di rilevanza dal javadoc , che elenca tutti i modelli di formato disponibili:
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;
Si noti che ha diversi formattatori predefiniti per i modelli più popolari. Quindi, invece di ad esempio DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, potresti usare DateTimeFormatter.RFC_1123_DATE_TIME
. Questo è possibile perché sono, al contrario SimpleDateFormat
, thread-safe. Potresti quindi anche definire il tuo, se necessario.
Per un particolare formato di stringa di input, non è necessario utilizzare un esplicito DateTimeFormatter
: una data ISO 8601 standard , come 2016-09-26T17: 44: 57Z, può essere analizzata direttamente LocalDateTime#parse(text)
poiché utilizza già il ISO_LOCAL_DATE_TIME
formattatore. Allo stesso modo, LocalDate#parse(text)
analizza una data ISO senza il componente orario (vedi ISO_LOCAL_DATE
) e ZonedDateTime#parse(text)
analizza una data ISO con un offset e un fuso orario aggiunti (vedi ISO_ZONED_DATE_TIME
).