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"
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
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
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.
String
. Cette classe contient une séquence de caractères, rien de plus. Ces personnages peuvent représenter n'importe quoi; dans ce cas, c'est une dateJava.util.Date
, puis par Java.util.Calendar
, mais ces classes sont pleines de problèmes et vous devriez les éviter si possible. Aujourd'hui, nous avons une meilleure API pour cela .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:
String
en un type de date (transforme le texte en valeurs numériques de jour/mois/année) - cela s'appelle analysePourquoi vos tentatives n'ont pas fonctionné:
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.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 .
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());
}
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
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 "";
}
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