2017-02-06 1 views
1

J'ai ce problème vraiment étrange d'un petit extrait de code fonctionnant sur une machine, et pas une autre. Ce code:Java - DateTimeFormatter - ParseException

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd"); 
    Map<LocalDate, Double> temperatur = new TreeMap<>(); 
    for (LocalDate currentDate = LocalDate.parse("2014-jan-01", formatter); currentDate.getYear() < 2015; currentDate = currentDate.plusDays(1)) 
    { 
     String date = currentDate.toString(); 
     int stringIndex = (data.indexOf(date)); 
     String tempString = data.substring((stringIndex + 31), (stringIndex + 35)); 
     if(tempString.contains(";")) 
      tempString = tempString.substring(0, 3); 
     double temp = Double.parseDouble(tempString); 
     temperatur.put(currentDate, temp); 
    } 

me donne l'exception:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2014-jan-01' could not be parsed at index 5 
    at java.time.format.DateTimeFormatter.parseResolved0(Unknown Source) 
    at java.time.format.DateTimeFormatter.parse(Unknown Source) 
    at java.time.LocalDate.parse(Unknown Source) 
    at main.SMHITest.getValues(SMHITest.java:50) 
    at main.DataCollectionBuilder.addToResult(DataCollectionBuilder.java:46) 
    at main.DataCollectionBuilder.<init>(DataCollectionBuilder.java:25) 
    at main.ClientProgram.main(ClientProgram.java:14) 

La ligne SMHITest.Java:50 est que vous pouvez deviner à la boucle. La partie étrange est, ce morceau de code fonctionne très bien sur un ordinateur, mais refuse de travailler pour moi à la maison. Les deux machines exécutent Eclipse mars jee, mais une machine (où son fonctionnement) exécute java 1.8.0_112, et l'autre exécute java 1.8.0_121-b13. Mais je ne peux pas imaginer que ce serait le problème?

+0

Est-ce que "J" de "Jan" doit être capitalisé? – Keith

+0

Oui, il semble que oui, parce que ça l'a fait! Je vous remercie! Bien qu'il soit encore étrange que ce n'était pas nécessaire sur l'autre machine. Mais malade laisse là. Merci encore. – Sletten

Répondre

0

l'erreur est renvoyée car la date «2014-jan-01» ne correspond pas au format yyyy-MMM-dd. Il doit être 2014-Jan-01

ne sais pas ce que vous essayez d'atteindre ici dans ce qui suit,

String tempString = data.substring((stringIndex + 31), (stringIndex + 35)); 

if(tempString.contains(";")) 

que la date 2014-01-0 ne contient '; 'ou il comprend 35 caractères.

+0

Oui, tout comme Keith a souligné que le J devait être capitalisé. Ce qui est encore bizarre puisque c'est le même exakt (j'ai vérifié en fait après avoir corrigé) le code sur l'autre machine. Mais merci! La chaîne "data" est remplie avec un tas de données d'un fichier json et est complètement hors contexte ici, j'aurais probablement dû couper cette partie. – Sletten

+0

LocalDate est introduit dans java8 et il devrait se comporter même dans toutes les machines. Je suppose que vous devez manquer quelque chose d'autre. –

+0

Oui, vous avez probablement raison. Je suis juste vraiment confus de quoi. Mais je suppose que je dois juste continuer maintenant que ça marche. Cela me dérange cependant, haha. – Sletten

0

Le seul (et maladroit) façon de analyser une telle chaîne comme « 2014-jan-01 » de manière insensible à la casse en utilisant la nouvelle java.time -API se présente comme suit:

String input = "2014-jan-01"; 
DateTimeFormatter dtf = 
    new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("uuuu-MMM-dd") 
    .toFormatter().withLocale(Locale.ENGLISH); 
LocalDate date = dtf.parse(input, LocalDate::from); 
System.out.println(date); // 2014-01-01