web-dev-qa-db-fra.com

Convertir la date de chaîne en format différent de date de chaîne

Je suis nouveau à Java. Postgres db contient le format de date est yyyy-MM-dd. Je dois convertir en dd-MM-yyyy.

J'ai essayé, mais un mauvais résultat est affiché

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

    String strDate = "2013-02-21";
      DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
      Date da = (Date)formatter.parse(strDate);
      System.out.println("==Date is ==" + da);
      String strDateTime = formatter.format(da);

      System.out.println("==String date is : " + strDateTime);
}
12
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat format2 = new SimpleDateFormat("dd-MM-yyyy");
Date date = format1.parse("2013-02-21");
System.out.println(format2.format(date));
32
asifsid88

Vous devez utiliser deux instances DateFormat. Un qui contient le format de la chaîne d'entrée et un second qui contient le format souhaité pour la chaîne de sortie.

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

    String strDate = "2013-02-21";

    DateFormat inputFormatter = new SimpleDateFormat("yyyy-MM-dd");
    Date da = (Date)inputFormatter.parse(strDate);
    System.out.println("==Date is ==" + da);

    DateFormat outputFormatter = new SimpleDateFormat("dd-MM-yyyy");
    String strDateTime = outputFormatter.format(da);
    System.out.println("==String date is : " + strDateTime);
}
9
Tim Bender

Référencez ces formats Java Date Format Docs :

Formats for datetime

Essayez ce code:

String myDate= "2013-02-21";
DateFormat iFormatter = new SimpleDateFormat("yyyy-MM-dd");
DateFormat oFormatter = new SimpleDateFormat("dd-MM-yyyy");
String strDateTime = oFormatter.format(iFormatter.parse(myDate));
3
Zaheer Ahmed

Vous avez besoin d'un format pour analyser l'état actuel et d'un format pour générer la sortie souhaitée.

String strDate  = "2013-02-21";
DateFormat to   = new SimpleDateFormat("dd-MM-yyyy"); // wanted format
DateFormat from = new SimpleDateFormat("yyyy-MM-dd"); // current format
System.out.println(to.format(from.parse(strDate)));
2
jlordo

Essayez la fonction utilitaire suivante.

// convert String date to another string date
public String convertStringDateToAnotherStringDate(String stringdate, String stringdateformat, String returndateformat){        

        try {
            Date date = new SimpleDateFormat(stringdateformat).parse(stringdate);
            String returndate = new SimpleDateFormat(returndateformat).format(date);
            return returndate;
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "";
        }

}

// call function with required parameter arguments
String resultDate = convertStringDateToAnotherStringDate("2017-06-22", "yyyy-MM-dd", "dd-MM-yyyy")
System.out.println(resultDate);

Résultat: 22-06-2017

1
Krunal

vous utilisez le même formateur pour gérer différents formats.

vous devez fournir deux formateurs new SimpleDateFormat("dd-MM-yyyy"); pour convertir 2013-02-21 en objet date et new SimpleDateFormat("dd-MM-yyyy"); pour formater l'objet date en la chaîne 21-02-2013.

0
A4L

Tout d'abord, vous ne devriez pas obtenir votre date en tant que String dans votre base de données Postgres. Vous devez l'obtenir en tant qu'objet d'un type représentant une date.

Deuxièmement, alors qu'en 2013, l'utilisation de Date et SimpleDateFormat était courante et raisonnable, des jours se sont écoulés et de nouvelles et meilleures classes de date et d'heure sont sorties et sont devenues courantes. À mon humble avis, personne ne devrait plus utiliser les anciennes classes et je les considère comme dépassées depuis longtemps.

Pour obtenir un objet LocalDate de votre ResultSet de votre base de données:

    LocalDate da = yourResultSet.getObject(3, LocalDate.class);

(Je suppose que la date est dans la colonne 3 de la requête).

Pour le formater en dd-MM-yyyy:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-uuuu");
    String strDateTime = da.format(formatter);
    System.out.println("==String date is : " + strDateTime);

Cela donnerait une sortie comme

==String date is : 21-02-2013

Enfin, dans le cas où vous avez une chaîne comme dans la question et que vous souhaitez la reformater dans le format souhaité:

    String strDate = "2013-02-21";      
    LocalDate da = LocalDate.parse(strDate);
    System.out.println("==Date is ==" + da);

Cela imprime

==Date is ==2013-02-21

Je profite du fait que la chaîne correspond au format de date standard ISO 8601 qui est la valeur par défaut pour les classes de date et d'heure modernes. Dans ce cas, nous n'avons pas besoin d'un formateur explicite pour l'analyse, comme nous le ferions pour l'analyse d'autres formats.

Le formatage dans le format souhaité se déroule exactement comme avant.

Un exemple du problème avec les anciennes classes

Sur mon ordinateur, la sortie du code de la question est

==Date is ==Tue Aug 06 00:00:00 CET 26
==String date is : 06-08-0026

Vous obtenez clairement un mauvais résultat et vous ne savez pas ce qui n'allait pas. Ce qui était incorrect était que vous analysiez votre chaîne de date db, 2013-02-21, avec le formateur que vous avez prévu pour la chaîne new, dd-MM-yyyy. Il est donc analysé comme le 2013 février 21 AD. Il n'y a pas 2013 jours en février? Pas de problème pour un SimpleDateFormat avec des paramètres par défaut, il continue juste à compter les jours dans les mois et les années suivants et se termine au 6 août cinq ans et demi plus tard, mais toujours très tôt dans l'histoire.

Si nous essayons de faire de même avec les classes modernes:

    LocalDate.parse(strDate, formatter);

- on a Java.time.format.DateTimeParseException: Text '2013-02-21' could not be parsed at index 2. Cela est dû au fait que le formateur indique un jour à 2 chiffres. Ainsi, après avoir analysé deux chiffres, il y a plus de chiffres dans la chaîne d'entrée, c'est une erreur et est signalé comme tel. Je considère ce comportement plus correct et plus utile.

0
Ole V.V.

Vous devez utiliser l'instance SimpleDateFormat et passer le modèle de date que vous préférez.

Modèle actuel: yyyy-MM-dd

Le modèle requis: dd-MM-yyyy

Maintenant, essayez ce qui suit. Il produit le modèle de format de date requis.

public class App {
    public static void main(String[] args) {
        SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat format2 = new SimpleDateFormat("dd-MM-yyyy");
        Date date = null;
        try {
            date = format1.parse("2013-02-21");
            System.out.println(format1.format(date)); //current format: 2013-02-21
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println(format2.format(date)); //the format that is needed : 21-02-2013
    }
}
0
Dulith De Costa