C'est la voie difficile, et ces java.util.Date
méthodes de définition sont obsolètes depuis Java 1.1 (1997). Formatez simplement la date en SimpleDateFormat
utilisant un modèle de format correspondant à la chaîne d'entrée .
Dans votre cas spécifique de "2 janvier 2010" comme chaîne d'entrée:
- "Janvier" est le mois du texte intégral, utilisez donc le
MMMM
modèle pour cela
- "2" est le court jour du mois, utilisez donc le
d
modèle pour cela.
- "2010" est l'année à 4 chiffres, utilisez donc le
yyyy
modèle pour cela.
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' Locale
argument explicite . Si vous l'omettez, il utilisera les paramètres régionaux par défaut qui ne sont pas nécessairement l'anglais comme 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 d'entrée, vous obtiendrez alors une confusion, java.text.ParseException
même si le modèle de format semble valide.
Voici un extrait de la pertinence du javadoc , répertoriant tous les modèles de format disponibles:
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
Notez que les modèles sont sensibles à la casse et que les modèles basés sur du texte de quatre caractères ou plus représentent la forme complète; sinon, un formulaire court ou abrégé est utilisé s'il est disponible. Donc, par exemple, MMMMM
ou plus n'est pas nécessaire.
Voici quelques exemples de SimpleDateFormat
modèles valides pour analyser une chaîne donnée à ce jour:
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
Une note importante est que ce SimpleDateFormat
n'est pas sûr pour les threads. En d'autres termes, vous ne devez jamais le déclarer et l'assigner en tant que variable statique ou d'instance, puis le réutiliser à partir de différentes méthodes / threads. Vous devez toujours le créer tout nouveau dans le cadre local de la méthode.
Mise à jour Java 8
Si vous êtes sur Java 8 ou une version plus récente, utilisez DateTimeFormatter
(également ici, cliquez sur le lien pour voir tous les formateurs prédéfinis et les modèles de format disponibles; le tutoriel est disponible ici ). Cette nouvelle API est inspirée de 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
Remarque: si votre modèle de format contient également la partie temps, utilisez-le à la LocalDateTime#parse(text, formatter)
place de LocalDate#parse(text, formatter)
. Et, si votre modèle de format contient également le fuseau horaire, utilisez-le à la ZonedDateTime#parse(text, formatter)
place.
Voici un extrait de la pertinence du javadoc , répertoriant tous les modèles de format disponibles:
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;
Notez qu'il a plusieurs formateurs prédéfinis pour les modèles les plus populaires. Donc, au lieu de, par exemple DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
, vous pouvez utiliser DateTimeFormatter.RFC_1123_DATE_TIME
. Cela est possible car ils sont, au contraire SimpleDateFormat
, thread-safe. Vous pouvez donc également définir le vôtre, si nécessaire.
Pour un format de chaîne d'entrée particulier, vous n'avez pas besoin d'utiliser une explicite DateTimeFormatter
: une date ISO 8601 standard , comme 2016-09-26T17: 44: 57Z, peut être analysée directement LocalDateTime#parse(text)
car elle utilise déjà le ISO_LOCAL_DATE_TIME
formateur. De même, LocalDate#parse(text)
analyse une date ISO sans le composant temps (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
).