web-dev-qa-db-fra.com

Comment analyser une date?

J'essaie d'analyser cette date avec SimpleDateFormat et cela ne fonctionne pas:

import Java.text.ParseException;
import Java.text.SimpleDateFormat;
import Java.util.Date;

public class Formaterclass {
    public static void main(String[] args) throws ParseException{
        String strDate = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dateStr = formatter.parse(strDate);
        String formattedDate = formatter.format(dateStr);
        System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
        Date date1 = formatter.parse(formattedDate);

        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        formattedDate = formatter.format(date1);
        System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
    }
}

Si j'essaie ce code avec strDate = "2008-10-14", j'ai une réponse positive. Quel est le problème? Comment puis-je analyser ce format?

PS J'ai obtenu cette date d'un jDatePicker et il n'y a aucune instruction sur la façon de modifier le format de la date que je reçois lorsque l'utilisateur choisit une date.

173
fenec

Vous ne pouvez pas vous attendre à analyser une date avec un SimpleDateFormat configuré avec un format différent.

Pour analyser votre chaîne de date "Thu Jun 18 20:56:02 EDT 2009", vous avez besoin d'un SimpleDateFormat comme ceci (à peu près):

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

Utilisez cette option pour analyser la chaîne dans une date, puis votre autre SimpleDateFormat pour convertir cette date au format souhaité.

        String input = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(date);

        ...

JavaDoc: http://docs.Oracle.com/javase/7/docs/api/Java/text/SimpleDateFormat.html

232
jwl

Le problème est que vous avez une date formatée comme ceci:

Thu Jun 18 20:56:02 EDT 2009

Mais utilisez un SimpleDateFormat qui est:

yyyy-MM-dd

Les deux formats ne sont pas d'accord. Vous devez construire un SimpleDateFormat qui correspond à la disposition de la chaîne que vous essayez d'analyser dans une Date. Aligner les choses pour le rendre facile à voir, vous voulez un SimpleDateFormat comme ceci:

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

Consultez la page JavaDoc à laquelle j'ai lié et voyez comment les caractères sont utilisés.

50
Eddie

Nous avons maintenant une manière plus moderne de faire ce travail.

Java.time

Le cadre Java.time est fourni avec Java 8 et versions ultérieures. Voir Tutoriel . Ces nouvelles classes sont inspirées par Joda-Time , définies par JSR 31 et étendues par le projet ThreeTen-Extra . Ils représentent une amélioration considérable par rapport aux anciennes classes gênantes, Java.util.Date/.Calendar et al.

Notez que les codes à 3 ou 4 lettres tels que EDT ne sont ni normalisés ni uniques. Évitez-les autant que possible. Apprenez plutôt à utiliser ISO 8601 formats standard. Le framework Java.time peut être difficile à traduire, mais la plupart des codes couramment utilisés ont des valeurs en double.

Soit dit en passant, Java.time génère par défaut des chaînes utilisant les formats ISO 8601 mais étendues en ajoutant le nom du fuseau horaire entre parenthèses.

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

Dump à la console.

System.out.println ( "zdt : " + zdt );

Quand couru.

zdt: 2009-06-18T20: 56: 02-04: 00 [America/New_York]

Ajuster le fuseau horaire

Pour le plaisir, ajustons-nous sur le fuseau horaire indien.

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

dimanche: 2009-06-19T06: 26: 02 + 05: 30 [Asie/Kolkata]

Convertir en j.u.Date

Si vous avez réellement besoin d'un objet Java.util.Date à utiliser avec des classes non encore mises à jour vers les types Java.time, convertissez-les. Notez que vous perdez le fuseau horaire attribué, mais que vous réglez automatiquement le même moment sur UTC .

Java.util.Date date = Java.util.Date.from( zdt.toInstant() );
17
Basil Bourque

Que diriez-vous de getSelectedDate ? Quoi qu'il en soit, spécifiquement sur votre question de code, le problème vient de cette ligne:

new SimpleDateFormat("yyyy-MM-dd");

La chaîne qui va dans le constructeur doit correspondre au format de la date. La documentation pour savoir comment faire est ici . On dirait que vous avez besoin de quelque chose proche de "EEE MMM d HH: mm: ss zzz yyyy"

12
Yishai

En réponse à: "Comment convertir Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México)) à jj-MM-aa en Java?", il était marqué comment dupliquer

Essayez ceci: avec Java.util.Date, Java.text.SimpleDateFormat, c'est une solution simple.

public static void main(String[] args) throws ParseException {

    String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
    Date f = new Date(fecha);

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
    fecha = sdf.format(f);
    System.out.println(fecha);
}
1
Edgar Civil