C'est la manière forte, et ceux java.util.Date
Les méthodes setter sont dépréciées depuis Java 1.1 (1997). De plus, l'ensemble des java.util.Date
était de facto dépréciée (déconseillée) depuis l'introduction de la classe java.time
API en Java 8 (2014).
Il suffit de formater la date en utilisant DateTimeFormatter
avec un motif correspondant à la chaîne de caractères d'entrée ( le tutoriel est disponible ici ).
Dans votre cas spécifique de "2 janvier 2010" comme chaîne d'entrée :
- "Janvier" est le mois en texte intégral, utilisez donc l'option
MMMM
modèle pour cela
- "2" est le jour court du mois, utilisez donc la touche
d
pour le modèle.
-
"2010" est l'année à 4 chiffres, utilisez donc l'option yyyy
pour le modèle.
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
Note : si votre modèle de format contient également la partie temps, utilisez alors LocalDateTime#parse(text, formatter)
au lieu de LocalDate#parse(text, formatter)
. Et, si votre modèle de format contient également le fuseau horaire, alors utilisez ZonedDateTime#parse(text, formatter)
à la place.
Voici un extrait pertinent de la javadoc qui énumère tous les modèles de format disponibles :
Symbole
Signification
Présentation
Exemples
G
ère
texte
AD ; Anno Domini ; A
u
année
année
2004 ; 04
y
année de l'ère
année
2004 ; 04
D
jour de l'année
numéro
189
M
/ L
mois de l'année
nombre/texte
7 ; 07 ; Jul ; July ; J
d
jour du mois
numéro
10
Q
/ q
trimestre de l'année
nombre/texte
3 ; 03 ; Q3 ; 3ème trimestre
Y
année basée sur la semaine
année
1996 ; 96
w
année basée sur la semaine
numéro
27
W
semaine du mois
numéro
4
E
jour de la semaine
texte
Mar ; Mardi ; T
e
/ c
jour de la semaine localisé
nombre/texte
2 ; 02 ; Mar ; Mardi ; T
F
semaine du mois
numéro
3
a
am-pm du jour
texte
PM
h
heure de l'am-pm (1-12)
numéro
12
K
heure de l'am-pm (0-11)
numéro
0
k
heure de l'am-pm (1-24)
numéro
0
H
heure du jour (0-23)
numéro
0
m
minute de l'heure
numéro
30
s
seconde minute
numéro
55
S
fraction de seconde
fraction
978
A
millier de jours
numéro
1234
n
nano-seconde
numéro
987654321
N
nano-journée
numéro
1234000000
V
ID du fuseau horaire
zone-id
Amérique/Los_Angeles ; Z ; -08:30
z
nom du fuseau horaire
nom de la zone
Heure normale du Pacifique ; PST
O
décalage de zone localisé
offset-O
GMT+8 ; GMT+08:00 ; UTC-08:00 ;
X
zone-offset 'Z' pour zéro
offset-X
Z ; -08 ; -0830 ; -08:30 ; -083015 ; -08:30:15 ;
x
décalage de zone
offset-x
+0000 ; -08 ; -0830 ; -08:30 ; -083015 ; -08:30:15 ;
Z
décalage de zone
offset-Z
+0000 ; -0800 ; -08:00 ;
Notez qu'il comporte plusieurs formateurs prédéfinis pour les motifs les plus populaires. Ainsi, au lieu de par ex. DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
vous pouvez utiliser DateTimeFormatter.RFC_1123_DATE_TIME
. Cela est possible parce qu'ils sont, au contraire de SimpleDateFormat
sans fil. Vous pouvez donc également définir vos propres règles, si nécessaire.
Pour un format de chaîne de caractères d'entrée particulier, il n'est pas nécessaire d'utiliser une fonction explicite DateTimeFormatter
: une norme ISO 8601 comme 2016-09-26T17:44:57Z, peut être analysée directement avec la fonction LocalDateTime#parse(text)
car il utilise déjà le ISO_LOCAL_DATE_TIME
formateur. De même, LocalDate#parse(text)
analyse une date ISO sans la composante temporelle (voir ISO_LOCAL_DATE
), et ZonedDateTime#parse(text)
analyse une date ISO avec un décalage et un fuseau horaire ajoutés (voir ISO_ZONED_DATE_TIME
).
Pré-Java 8
Au cas où vous ne seriez pas encore sous Java 8, ou si vous êtes obligé d'utiliser java.util.Date
puis formatez la date en utilisant SimpleDateFormat
en utilisant un modèle de format correspondant à la chaîne d'entrée.
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
Notez l'importance de l'explicite Locale
argument. Si vous l'omettez, il utilisera l'option locale par défaut qui n'est pas nécessairement l'anglais utilisé dans le nom du mois de la chaîne d'entrée. Si les paramètres régionaux ne correspondent pas à la chaîne de caractères d'entrée, vous obtiendrez un message d'erreur de type java.text.ParseException
même si le modèle de format semble valide.
Voici un extrait pertinent de la javadoc qui énumère tous les modèles de format disponibles :
Lettre
Composant de la date ou de l'heure
Présentation
Exemples
G
Indicateur d'époque
Texte
AD
y
Année
Année
1996 ; 96
Y
Semaine année
Année
2009 ; 09
M
/ L
Mois de l'année
Mois
Juillet ; Jul ; 07
w
Semaine de l'année
Numéro
27
W
Semaine dans le mois
Numéro
2
D
Jour de l'année
Numéro
189
d
Jour du mois
Numéro
10
F
Jour de la semaine dans le mois
Numéro
2
E
Jour de la semaine
Texte
Mardi ; Mar
u
Numéro du jour de la semaine
Numéro
1
a
Marqueur Am/pm
Texte
PM
H
Heure de la journée (0-23)
Numéro
0
k
Heure de la journée (1-24)
Numéro
24
K
Heure en am/pm (0-11)
Numéro
0
h
Heure en am/pm (1-12)
Numéro
12
m
Minute dans l'heure
Numéro
30
s
Seconde en minute
Numéro
55
S
Milliseconde
Numéro
978
z
Fuseau horaire
Fuseau horaire général
Heure normale du Pacifique ; PST ; GMT-08:00
Z
Fuseau horaire
Fuseau horaire RFC 822
-0800
X
Fuseau horaire
Fuseau horaire ISO 8601
-08 ; -0800 ; -08:00
Notez que les modèles sont sensibles à la casse et que les modèles textuels de quatre caractères ou plus représentent la forme complète ; sinon, une forme courte ou abrégée est utilisée si elle est disponible. Ainsi, par exemple MMMMM
ou plus est inutile.
Voici quelques exemples valables SimpleDateFormat
pour analyser une chaîne de caractères donnée jusqu'à la date :
Chaîne d'entrée
Patronage
2001.07.04 AD à 12:08:56 PDT
yyyy.MM.dd G 'at' HH:mm:ss z
Mer, 4 Julliet, '01
EEE, MMM d, ''yy
12:08 PM
h:mm a
12 heures, heure avancée du Pacifique.
hh 'o''clock' a, zzzz
0:08 PM, PDT
K:mm a, z
02001.juillet.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
Il est important de noter que SimpleDateFormat
es no sans fil. En d'autres termes, vous ne devez jamais la déclarer et l'affecter en tant que variable statique ou d'instance pour la réutiliser ensuite dans différentes méthodes/threads. Vous devez toujours la créer à l'état neuf dans la portée locale de la méthode.
16 votes
Notez que de nombreuses réponses ignorent des subtilités comme les lieux et les fuseaux horaires. Je vous recommande de lire attentivement la documentation relative aux classes Date, Calendar, TimeZone, Locale et SimpleDateFormat avant de les utiliser.
2 votes
Duplicata possible de Conversion de String en java.util.Date
7 votes
Java 8 fournit une nouvelle API Date/Heure. Si vous utilisez Java 8 (ou une version plus récente), vous devriez jeter un coup d'œil à cette réponse : stackoverflow.com/a/22180505/1115554
2 votes
Tous les régleurs de
Date
sont dépréciés.0 votes
La remarque de @micha est pertinente, les classes les plus récentes sont tellement plus agréables à utiliser, comportent tellement moins de surprises négatives et modélisent vos exigences en matière de date et d'heure avec tellement plus de précision. Vous pouvez les utiliser avec Java 6 et 7 également si vous pouvez vivre avec une dépendance à l'égard de Sac à dos ThreeTen .
7 votes
Pour votre information, les anciennes classes de date-heure gênantes telles que
java.util.Date
,java.util.Calendar
yjava.text.SimpleTextFormat
sont maintenant héritage supprimé par le java.time classes. Voir Tutoriel par Oracle .0 votes
Pour avoir un aperçu de la complexité de l'analyse syntaxique de la date et de l'heure et de la manière de la réaliser avec le logiciel JDK 8
java.time
API, voir ma réponse ici : stackoverflow.com/a/56508200/145989