web-dev-qa-db-fra.com

Comment convertir une chaîne en une 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"));

Quand je lance ceci, je reçois ceci comme sortie:

Sun Jan 16 00:10:00 IST 2011

J'esperais:

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?

60
Shantanu Tomar

Essaye ça:

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

Tout est dans le javadoc pour SimpleDateFormat


Pour votre information, la raison pour laquelle votre format est toujours valide est la suivante:

  • mm est "minutes"
  • DD est "jour dans l'année"

De plus, vous n'avez pas besoin du transtypage en Date... il est déjà est une Date (ou elle 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

Voila!

89
Bohemian

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 
42
jahir

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));
    }

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();
    }
11
Chand Priyankara
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()));
6
kandarp

Exemple très simple est.

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());
            }
4
Krishna

Ce morceau de code aide à convertir en arrière

    System.out.println("Date: "+ String.valueOf(new Date()));
    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String stringdate = dt.format(new Date());
    System.out.println("String.valueOf(date): "+stringdate);

    try {
    Date date = dt.parse(stringdate);
    System.out.println("parse date: "+ String.valueOf(date));
    } catch (ParseException e) {
    e.printStackTrace();
    }
4
Alfred Ayi-bonte

vous pouvez résoudre le problème de manière très simple comme Convertissez d’abord la chaîne donnée en objet date par exemple: 

Java.util.Date date1 = new Date("11/19/2015"); 
SimpleDateFormat formatter = new SimpleDateFormat("MMM dd yyyy HH:mma");
String format = formatter.format(date);
System.out.println(format);
3
BEN SEBASTIAN
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM/dd/uuuu");
    System.out.println(LocalDate.parse("08/16/2011", dateFormatter));

Sortie:

2011-08-16

Je contribue la réponse moderne. La réponse de Bohemian est correcte et était une bonne réponse quand il a été écrit il y a 6 ans. Maintenant, la classe notoirement problématique SimpleDateFormat est depuis longtemps obsolète et nous avons tellement mieux avec Java.time, l'API de date et heure moderne de Java. Je vous recommande chaudement d'utiliser ceci à la place des anciennes classes date-heure.

Qu'est-ce qui n'allait pas dans votre code?

Lorsque j'analyse 08/16/2011 à l'aide de votre extrait, j'obtiens Sun Jan 16 00:08:00 CET 2011. Étant donné que mm minuscule correspond aux minutes, j'obtiens 00:08:00 (huit minutes après minuit) et, puisque DD majuscule correspond au jour de l'année, le 16 janvier.

Dans Java.time également, les chaînes de modèle de format sont sensibles à la casse et nous devions utiliser MM majuscule pour mois et dd minuscule pour jour du mois.

Question: Puis-je utiliser Java.time avec ma version Java?

Oui, Java.time fonctionne parfaitement sur Java 6 et ultérieur, ainsi que sur les appareils Android anciens et récents.

  • Dans Java 8 et versions ultérieures, ainsi que sur les nouveaux appareils Android (à partir de l’API 26, on me dit), l’API moderne est intégrée.
  • En Java 6 et 7, obtenez ThreeTen Backport, le backport des nouvelles classes (ThreeTen pour JSR 310; voir les liens en bas).
  • Sous Android (plus ancien), utilisez l’édition Android de ThreeTen Backport. Il s’appelle ThreeTenABP. Et assurez-vous d'importer les classes de date et d'heure à partir de org.threeten.bp avec des sous-packages.

Liens

2
Ole V.V.
String localFormat = Android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE MMMM d");
return new SimpleDateFormat(localFormat, Locale.getDefault()).format(localMidnight);

retournera un format basé sur la langue du périphérique . Notez que getBestDateTimePattern () renvoie "la meilleure forme localisée possible du squelette donné pour la locale donnée".

1
Dan Alboteanu

Vous avez utilisé des erreurs de type type. Si vous souhaitez définir 08/16/2011 sur le modèle suivant. C'est faux parce que 

mm signifie minutes, utilisez MM comme pour mois

DD est faux, ce devrait être dd qui représente Days

Essayez ceci pour obtenir le résultat souhaité (Tue Aug 16 "Whatever Time" IST 2011),

    String date = "08/16/2011"; //input date as String

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy"); // date pattern

    Date myDate = simpleDateFormat.parse(date); // returns date object 

    System.out.println(myDate); //outputs: Tue Aug 16 00:00:00 IST 2011
1
Dulith De Costa