68 votes

Comment convertir une chaîne en date avec SimpleDateFormat ?

J'ai cet extrait de code :

DateFormat formatter1;
formatter1 = new SimpleDateFormat("mm/DD/yyyy");
System.out.println((Date)formatter1.parse("08/16/2011"));

Lorsque je l'exécute, j'obtiens ce résultat :

Sun Jan 16 00:10:00 IST 2011

Je m'y attendais :

Tue Aug 16 "Whatever Time" IST 2011

Je veux dire que je ne reçois pas le mois comme prévu. Quelle est l'erreur ?

0 votes

1 votes

Pour votre information, les anciennes classes de date-heure gênantes telles que java.util.Date , java.util.Calendar et java.text.SimpleDateFormat sont maintenant héritage supprimé par le java.time intégrées à Java 8 et aux versions ultérieures. Voir Réponse correcte moderne par Ole V.V.

95voto

Bohemian Points 134107

Essayez ça :

new SimpleDateFormat("MM/dd/yyyy")
  • MM est "mois" (et non mm )
  • dd est "jour" (et non DD )

Tout est dans le javadoc pour SimpleDateFormat

Pour info, la raison pour laquelle votre format est toujours un format de date valide est que :

  • mm est "minutes".
  • DD est "le jour de l'année".

De plus, vous n'avez pas besoin de la distribution pour Date ... il est déjà est a Date (ou il explose) :

public static void main(String[] args) throws ParseException {
    System.out.println(new SimpleDateFormat("MM/dd/yyyy").parse("08/16/2011"));
}

Sortie :

Tue Aug 16 00:00:00 EST 2011

Voilà !

0 votes

Pas de chance :( C'est toujours Jan Peu importe la valeur que je donne à MM, il m'affiche toujours Jan. La date et l'année fonctionnent bien

0 votes

@Bohème : Si j'utilise le même format (MM/jj/aaaa) avec une date erronée (c'est-à-dire 02/40/2013), le parsing n'échoue pas. J'obtiens le 12 mars 2013. Pourquoi ? Existe-t-il un moyen d'empêcher ce comportement ?

4 votes

@Cricket la valeur est analysée avec succès comme étant le 40ème jour de février, et est simplement reportée à un jour de mars pour tenir compte de la valeur hors limites. Pour éviter cela, appelez setLenient(false); sur l'objet de format avant l'analyse (l'indulgence est vraie par défaut).

45voto

jahir Points 81

M - min M - Mois

Letter  Date or Time Component  Presentation    Examples
G       Era designator          Text                AD
y       Year                    Year                1996; 96
M       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
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

2 votes

Merci pour le tableau, il est très utile de l'avoir sur cette page.

12voto

chandpriyankara Points 909

Utilisez la fonction ci-dessous

/**
     * Format a time from a given format to given target format
     * 
     * @param inputFormat
     * @param inputTimeStamp
     * @param outputFormat
     * @return
     * @throws ParseException
     */
    private static String TimeStampConverter(final String inputFormat,
            String inputTimeStamp, final String outputFormat)
            throws ParseException {
        return new SimpleDateFormat(outputFormat).format(new SimpleDateFormat(
                inputFormat).parse(inputTimeStamp));
    }

Voici un exemple d'utilisation :

    try {
        String inputTimeStamp = "08/16/2011";

        final String inputFormat = "MM/dd/yyyy";
        final String outputFormat = "EEE MMM dd HH:mm:ss z yyyy";

        System.out.println(TimeStampConverter(inputFormat, inputTimeStamp,
                outputFormat));

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

7voto

kandarp Points 1707
String newstr = "08/16/2011";
SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy");
SimpleDateFormat format = new SimpleDateFormat("EE MMM dd hh:mm:ss z yyyy");
Calendar c = Calendar.getInstance();
c.setTime(format1.parse(newstr));
System.out.println(format.format(c.getTime()));

4voto

Krishna Points 708

Un exemple très simple.

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
                Date date = new Date();
                Date date1 = new Date();
            try {
                System.out.println("Date1:   "+date1);
                System.out.println("date" + date);

                date = simpleDateFormat.parse("01-01-2013");
                date1 = simpleDateFormat.parse("06-15-2013");

                System.out.println("Date1 is:"+date1);
                System.out.println("date" + date);

            } catch (Exception e) {
                System.out.println(e.getMessage());
            }

0 votes

"15-06-2013" doit être remplacé par "15-06-2013".

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