Question

    

Cette question a déjà une réponse ici:

    
            
  •              Java chaîne à ce jour conversion                                      13 réponses                          
  •     
    

Je suis en train d'analyser cette date avec SimpleDateFormat et il 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 je tente 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. Je suis arrivé à cette date d'un jDatePicker et il n'y a pas d'instructions sur la façon de modifier le format de date que je reçois lorsque l'utilisateur choisit une date.

Était-ce utile?

La solution

Vous ne pouvez pas attendre à analyser une date avec un SimpleDateFormat qui est mis en place avec un format différent.

Pour analyser votre "18 Jeu Juin 2009 20:56:02 EDT" chaîne de date dont vous avez besoin d'un SimpleDateFormat comme celui-ci (à peu près):

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

Utilisez cette option pour analyser la chaîne en une date, puis l'autre SimpleDateFormat pour activer cette date dans le format que vous voulez.

        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

Autres conseils

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

Thu Jun 18 20:56:02 EDT 2009

Mais utilisent un SimpleDateFormat qui est:

yyyy-MM-dd

Les deux formats ne sont pas d'accord. Vous devez construire un SimpleDateFormat qui correspond à la mise en page de la chaîne que vous essayez d'analyser en une date. Doublure 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 I liés et voir comment les caractères sont utilisés.

Nous avons maintenant une façon plus moderne pour faire ce travail.

java.time

Le cadre java.time est avec Java 8 et versions ultérieures. Voir Tutorial . Ces nouvelles classes sont inspirés par Joda-Time , défini par JSR 310 et prolongée par le ThreeTen-extra projet. Ils sont une grande amélioration par rapport aux anciennes classes ennuyeuses, java.util.Date/.Calendar et al.

Notez que les codes 3-4 lettre comme EDT ne sont ni standardisés ni unique. Évitez de les autant que possible. Apprenez à utiliser ISO 8601 formats standard à la place. Le cadre de java.time peut prendre un coup de couteau à la traduction, mais la plupart des codes couramment utilisés ont des valeurs en double.

Par ailleurs, notez comment java.time par défaut génère des chaînes en utilisant les formats ISO 8601, mais étendu 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 );

Lorsque l'exécution.

  

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

Régler la zone horaire

Pour le plaisir, nous allons ajuster à la zone de temps en Inde.

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

zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Asie / Calcutta]

Convertir en j.u.Date

Si vous avez vraiment besoin d'un objet java.util.Date pour une utilisation avec des classes pas encore mis à jour les types de java.time, convertir. Notez que vous perdez la zone de temps imparti, mais qui ont le même temps réglé automatiquement UTC .

java.util.Date date = java.util.Date.from( zdt.toInstant() );

Que diriez-vous getSelectedDate ? Quoi qu'il en soit, en particulier sur votre question de code, le problème est avec cette ligne:

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

La chaîne qui va dans le constructeur doit correspondre au format de la date. La documentation sur la façon de le faire est . On dirait que vous avez besoin de quelque chose proche de "d HH EEE MMM: mm: ss zzz aaaa"

En réponse à: " Comment convertir 13 Mar septembre 2016 00:00:00 GMT-0500 (Hora de verano central (México)) à JJ-MM-yy en Java? ", il a été marqué comment double

Essayez ceci: Avec java.util.Date, java.text.SimpleDateFormat, il 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top