web-dev-qa-db-fra.com

java.time.format.DateTimeParseException: le texte n'a pas pu être analysé à l'index 3

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

8
Uma

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/

3
Ramakanth Putta

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).

18
user7605325

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

0
forever LA