J'utilise Java 8 pour analyser la date et trouver la différence entre deux dates.
Voici mon extrait:
String date1 ="01-JAN-2017";
String date2 = "02-FEB-2017";
DateTimeFormatter df = DateTimeFormatter .ofPattern("DD-MMM-YYYY", en);
LocalDate d1 = LocalDate.parse(date1, df);
LocalDate d2 = LocalDate.parse(date2, df);
Long datediff = ChronoUnit.DAYS.between(d1,d2);
Quand je cours, j'obtiens l'erreur:
Java.time.format.DateTimeParseException: le texte n'a pas pu être analysé à l'index 3
Le code suivant fonctionne. Le problème est que vous utilisez "JAN" au lieu de "Jan" . DateTimeFormatter ne reconnaît pas que cela semble. et changez également le motif en "d-MMM-aaaa".
String date1 ="01-Jan-2017";
String date2 = "02-Feb-2017";
DateTimeFormatter df = DateTimeFormatter.ofPattern("d-MMM-yyyy");
LocalDate d1 = LocalDate.parse(date1, df);
LocalDate d2 = LocalDate.parse(date2, df);
Long datediff = ChronoUnit.DAYS.between(d1,d2);
Source: https://www.mkyong.com/Java8/Java-8-how-to-convert-string-to-localdate/
Tout d’abord, vérifiez le javadoc . La D
en majuscule représente le champ jour de l’année (et non le jour-du-mois comme vous le souhaitez), et la Y
en majuscule représente le champ semaine-basé-année (pas le an comme vous le souhaitez). Les modèles corrects sont les lettres minuscules d
et y
.
De plus, vous utilisez des noms de mois en lettres majuscules (JAN
et FEB
). Votre formateur doit donc être insensible à la casse (le comportement par défaut consiste à accepter uniquement des valeurs telles que Jan
et Feb
Et ces noms de mois sont des abréviations anglaises, vous devez donc également utiliser les paramètres régionaux anglais pour vous assurer que les noms sont analysés correctement (à l'aide de Java.util.Locale
class).
Donc, votre formateur devrait être créé comme ceci:
DateTimeFormatter df = new DateTimeFormatterBuilder()
// case insensitive to parse JAN and FEB
.parseCaseInsensitive()
// add pattern
.appendPattern("dd-MMM-yyyy")
// create formatter (use English Locale to parse month names)
.toFormatter(Locale.ENGLISH);
Cela fera fonctionner votre code (et datediff
sera 32
).
Peut-être que vous pouvez utiliser ce joker,
String d2arr[] = {
"2016-12-21",
"1/17/2016",
"1/3/2016",
"11/23/2016",
"OCT 20 2016",
"Oct 22 2016",
"Oct 23", // default year is 2016
"OCT 24", // default year is 2016
};
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder()
.parseCaseInsensitive().parseLenient()
.parseDefaulting(ChronoField.YEAR_OF_ERA, 2016L)
.appendPattern("[yyyy-MM-dd]")
.appendPattern("[M/dd/yyyy]")
.appendPattern("[M/d/yyyy]")
.appendPattern("[MM/dd/yyyy]")
.appendPattern("[MMM dd yyyy]");
DateTimeFormatter formatter2 = builder.toFormatter(Locale.ENGLISH);
https://coderanch.com/t/677142/Java/DateTimeParseException-Text-parsed-unparsed-textentrez la description du lien ici