1011 votes

Conversion d'une chaîne de caractères Java en date

Quelle est la meilleure façon de convertir un String sous le format "2 janvier 2010" à un fichier Date en Java ?

En fin de compte, je veux décomposer le mois, le jour et l'année sous forme d'entiers afin de pouvoir utiliser la méthode suivante

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

pour convertir la date en heure.

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

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

1844voto

BalusC Points 498232

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 :

  1. "Janvier" est le mois en texte intégral, utilisez donc l'option MMMM modèle pour cela
  2. "2" est le jour court du mois, utilisez donc la touche d pour le modèle.
  3. "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.

0 votes

Bonjour, en option O comment le laisser imprimer UTC+08:00 au lieu de GMT+08:00 . Je n'ai pas trouvé d'exemple.

0 votes

Il existe de nombreuses façons d'analyser les dates, en voici quelques-unes divers cas d'utilisation de DateFormat.parse

0 votes

Bonjour BalusC, j'ai une chaîne 20-JUN-16 12.00.00.000000000 AM J'ai besoin d'aide pour convertir ces données en date. Votre aide est très appréciée !

84voto

pn1 dude Points 1165

Ah oui, la discussion sur les dates Java, encore une fois. Pour gérer la manipulation de la date, nous utilisons Date , Calendrier , Calendrier grégorien y SimpleDateFormat . Par exemple, en utilisant votre date de janvier comme entrée :

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

Ensuite, vous pouvez manipuler cela avec quelque chose comme :

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

18 votes

N'oubliez pas que janvier est le mois numéro... 0

68voto

Ruthreshwar Points 363
String str_date = "11-June-07";
DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
Date date = formatter.parse(str_date);

17 votes

Quel est le but de séparer les déclarations et les définitions (bien que cela ne soit pas fait pour la première variable) ?

48voto

micha Points 7756

Avec Java 8, nous disposons d'une nouvelle API Date / Heure ( JSR 310 ).

La méthode suivante peut être utilisée pour analyser la date en Java 8 sans s'appuyer sur les éléments suivants Joda-Time :

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDate est la classe standard de Java 8 pour représenter une date (sans l'heure). Si vous voulez analyser des valeurs qui contiennent des informations sur la date et l'heure, vous devez utiliser la classe LocalDateTime . Pour les valeurs avec des fuseaux horaires, utilisez ZonedDateTime . Tous deux fournissent un parse() méthode similaire à LocalDate :

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

La liste des caractères de formatage de Javadoc de DateTimeFormatter :

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

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;

0 votes

Comment fonctionne la fraction de seconde ? Si j'utilise LocalDateTime date = LocalDateTime.parse("20140920111713000",DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")) ; cela échoue mais si j'utilise LocalDateTime date = LocalDateTime.parse("20140920111713.000",DateTimeFormatter.ofPattern("yyyyMMddHmmss.SSS")) ; cela fonctionne.

20voto

Jim Points 91

Pendant que nous traitons la classe SimpleDateFormat, il est important de se rappeler que Date n'est pas thread-safe et que vous ne pouvez pas partager un seul objet Date avec plusieurs threads.

Il existe également une grande différence entre "m" et "M", la minuscule étant utilisée pour les minutes et la majuscule pour le mois. Il en va de même pour "d" et "D". Cela peut causer des bugs subtils qui sont souvent négligés. Voir Javadoc o Guide pour convertir une chaîne en date en Java pour plus de détails.

1 votes

Cette différence m/M m'a coûté 5 minutes de frustration, merci de me l'avoir signalé :)

0 votes

Je suis surpris que personne ne l'ait mentionné. L'utilisation de SimpleDateFormat dans les applications Web (ou toute autre application multithread) est un gros non-sens. Jusqu'à Java 7, j'ai utilisé "FastDateFormat".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X