2011-08-16 5 views
4
String dateString = "20110706 1607"; 
    DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("YYYYMMDD HHMM"); 
    DateTime dateTime = dateStringFormat.parseDateTime(dateString); 

résultant stacktrace:problème de format non valide chaîne à l'analyse syntaxique JodaTime

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "201107206 1607" is malformed at " 1607" 
    at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:644) 
    at org.joda.time.convert.StringConverter.getInstantMillis(StringConverter.java:65) 
    at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:171) 
    at org.joda.time.DateTime.<init>(DateTime.java:168) 
...... 

Toute pensée? Si je tronque la chaîne à 20110706 avec le motif "YYYYMMDD" cela fonctionne, mais j'ai aussi besoin des valeurs des heures et des minutes. Ce qui est étrange est que je peux convertir un Jodatime DateTime à une chaîne en utilisant le même modèle « AAAAMMJJ HHMM » sans problème

Merci pour la recherche

+1

Ne pensez pas que ce soit le problème, mais le deuxième ensemble de "MM" devrait être "mm" – Jim

+0

Le texte dans le message d'erreur ne correspond pas à la chaîne que vous avez donné - est-il * vraiment * une seconde 2 dans la partie année/mois/jour? (201107206) –

+0

Problème résolu, je n'utilisais pas le modèle de formatage correct qui introduisait des caractères supplémentaires dans la chaîne dateString (voir stacktrace). Merci M. Skeet! – Hoofamon

Répondre

11

Regardez votre modèle - vous spécifiez « MM » deux fois. Cela ne peut probablement pas être juste. Ce serait essayer d'analyser le même champ (mois dans ce cas) deux fois à partir de deux bits différents du texte. Lequel espéreriez-vous gagner? Vous voulez:

DateTimeFormat.forPattern("yyyyMMdd HHmm") 

Regardez le documentation for DateTimeFormat pour voir ce que tout signifie.

Notez que bien que l'appel toString avec ce modèle va produire une chaîne, il ne produira pas la chaîne que vous voulez à. Je ne serais pas surpris si la sortie incluait "YYYY" et "DD" en raison du boîtier, bien que je ne puisse pas le tester maintenant. À tout le moins, vous auriez le mois deux fois au lieu des minutes apparaissant à la fin.

Questions connexes