web-dev-qa-db-fra.com

Simpledateformat date imparable

J'ai une String dans une base de données (match.getDate) qui a le format de date suivant:

01/04/2018

C'est la date que je veux formater, stockée sous le jour/mois/année. Je veux formater ceci pour mon application Android.

Je veux formater la date en:

Dim. 01 avril 2018

Mon code ci-dessous:

SimpleDateFormat fDate = new SimpleDateFormat("dd/MM/yyyy");
try {
    textViewDate.setText(fDate.parse(match.getDate()).toString());
} catch (ParseException ex) {
    System.out.println(ex.toString());
}

Cela génère:

Dimanche 08 avril 00h00:00 GMT + 00h00 2018.

J'ai aussi essayé "EE, MM d, yyyy", mais cela me donne:

Java.text.ParseException: date imparable: "01/04/2018"

3
Carl Bruiners

Utilisez cette méthode de formatage de date que j'ai créée

    public static String dateFormater(String dateFromJSON, String expectedFormat, String oldFormat) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(oldFormat);
    Date date = null;
    String convertedDate = null;
    try {
        date = dateFormat.parse(dateFromJSON);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(expectedFormat);
        convertedDate = simpleDateFormat.format(date);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return convertedDate;
}

et appelez cette méthode comme

dateFormater(" 01/04/2018" , "EE dd MMM yyyy" , "dd/MM/yyyy") 

et vous obtiendrez la sortie désirée

3
Harsh Patel

Les autres réponses ont résolu votre problème, mais j'estime qu'il est important de connaître certains concepts et de comprendre pourquoi votre première tentative n'a pas fonctionné.

Il y a une différence entre un date et un un texte qui représente une date.

Exemple: la date du jour est le 9 mars 2018. Cette date est juste un concept, une idée de "un point spécifique dans notre système de calendrier".

La même date, cependant, peut être représentée dans de nombreux formats. Cela peut être "graphique", sous la forme d'un cercle autour d'un nombre dans une feuille de papier avec beaucoup d'autres nombres dans un ordre spécifique, ou bien en texte brut

  • 09/03/2018 (jour/mois/année)
  • 03/09/2018 (mois/jour/année)
  • 2018-03-09 ( format ISO8601 )
  • 9 marsth 2018
  • 9 mars de 2018 (en portugais)
  • 2018 年 3 5 日 (en japonais)
  • etc...

Notez que les représentations textuelles sont différentes, mais qu'elles représentent toutes la même date (la même valeur).

Dans cet esprit, voyons comment Java fonctionne avec ces concepts.

Sous Android, vous pouvez utiliser les classes Java.time si disponibles dans le niveau d'API que vous utilisez ou les threeten backport pour les niveaux d'API inférieurs à celui-ci ( à vérifier ici comment l'utiliser ). Vous aurez des outils plus faciles et plus fiables pour traiter les dates.

Dans votre cas, vous avez une String (un texte représentant une date) et vous voulez le convertir en un autre format. Vous devez le faire en 2 étapes:

  1. convertit la String en un type de date (transforme le texte en valeurs numériques de jour/mois/année) - cela s'appelle analyse
  2. convertir cette valeur de type date en un format (transformer les valeurs numériques en texte dans un format spécifique) - cela s'appelle mise en forme

Pourquoi vos tentatives n'ont pas fonctionné:

  • la première tentative vous a donné un format incorrect parce que vous avez appelé Date::toString(), méthode , qui produit une sortie (une représentation textuelle) dans ce format (Sun Apr 08 00:00:00 GMT+00:00 2018) - l’analyse était donc correcte, mais le formatage ne l’était pas.
  • lors de la deuxième tentative, vous avez utilisé le modèle de sortie (EE dd MMM yyyy, celui que vous devez utiliser pour le formatage) pour analyser la date (à l'origine de la ParseException).

Pour l'étape 1, vous pouvez utiliser une LocalDate, un type représentant une date (jour, mois et année, sans heure ni fuseau horaire), car voici ce que vous saisissez:

String input = "01/04/2018";
DateTimeFormatter inputParser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// parse the input
LocalDate date = LocalDate.parse(input, inputParser);

C'est plus fiable que SimpleDateFormat car cela résout beaucoup de bugs et problèmes étranges de l'ancienne API.

Maintenant que nous avons notre objet LocalDate, nous pouvons effectuer l'étape 2:

// convert to another format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EE dd MMM yyyy", Locale.ENGLISH);
String output = date.format(formatter);

Notez que j'ai utilisé un Java.util.Locale. En effet, la sortie souhaitée porte le nom du jour de la semaine et du mois en anglais, et si vous ne spécifiez pas de paramètres régionaux, elle utilisera la valeur par défaut de la JVM (et qui garantit que ce sera toujours l'anglais? Il vaut mieux indiquer le API quelle langue vous utilisez au lieu de vous fier aux configurations par défaut, car celles-ci peuvent être modifiées à tout moment, même par d'autres applications s'exécutant sur la même machine virtuelle.

Et comment savoir quelles lettres doivent être utilisées dans DateTimeFormatter? Eh bien, je viens de lire le javadoc .

1
shind

Vous avez besoin de deux formateurs de date ici. Un pour analyser l’entrée et un autre formateur pour formater la sortie.

SimpleDateFormat inDateFmt = new SimpleDateFormat("dd/MM/yyyy");
SimpleDateFormat outDateFmt = new SimpleDateFormat("EEE dd MMM yyyy");
try {
    Date date = inDateFmt.parse(match.getDate());
    textViewDate.setText(outDateFmt.format(date));
} catch (ParseException ex) {
    System.out.println(ex.toString());
}
1
kshetline

Essayez avec new SimpleDateFormat("EEE dd MMM yyyy", Locale.ENGLISH);

Exemple de code:

DateFormat originalFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("EEE dd MMM yyyy", Locale.ENGLISH);
Date date = originalFormat.parse("01/04/2018");
String formattedDate = targetFormat.format(date);  // Sun 01 Apr 2018
1
Gokul Nath KP

Essayez ceci, vous pouvez créer le format de date de votre choix

        public String parseTime(String date){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-dd-MM HH:mm:ss");
        try {
            Date date1 = format.parse(date.replace("T"," "));
            String d= new SimpleDateFormat("yyyy/dd/MM HH:mm:ss").format(date1);
            return d;
        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }
0
akshay

tout d’abord, vérifiez votre méthode match.getDate () quel format donne la date si est donné ci-dessus définissez le format date puis utilisé sous le code et affichez la date au format défini ci-dessus ...

String date="09/03/2018";
    SimpleDateFormat parseDateFormat = new SimpleDateFormat("dd/MM/yyyy"); // if your match.getDate() given this format date.and if is given different format that time define that format.
    DateFormat formatdate = new SimpleDateFormat("EEE dd MMM yyyy");

    try {
        Date date1=parseDateFormat.parse(date);
        Log.d("New Date",formatdate.format(date1));
    } catch (ParseException e) {
        e.printStackTrace();
    }

sortie: vendredi 09 mars 2018

0
Android Team