java.text.ParseException: data irripetibile

Ho il seguente errore:'java.text.ParseException: Data irripetibile: "31 ago 09:53:19 2011" 'con questo formato: new SimpleDateFormat("MMM dd HH:mm:ss yyyy");

Qualcuno vede il problema?

  • Retrofit e OkHttpClient, timeout del collegamento di cattura nel metodo di fallimento
  • Manipolazione di nome di punto di accesso in android
  • Come fare Android BroadcastReceiver funzionare con AlarmManager?
  • Come affrontare i comandi interattivi di Linux?
  • Denial di authorization di Android 6.0: richiede l'authorization android.permission.WRITE_SETTINGS
  • Jackson mapping Oggetto o elenco di oggetti a seconda dell'ingresso json
  • Sovrasta il button di alimentazione come il button Home
  • Distriggersre il button "Force Stop" in Android
  • INSTALL_FAILED_DEXOPT errore durante l'installazione dell'applicazione
  • getExternalCacheDir () restituisce null dopo aver eliminato i dati
  • NoClassDefFoundError android / support / v4 / animation / AnimatorCompatHelper
  • Come rimuovere un runnable da un object gestore aggiunto da postDelayed?
  • 3 Solutions collect form web for “java.text.ParseException: data irripetibile”

    Assicurati di utilizzare il locale corretto. (Il SimpleDateFormat(String) utilizza la locale predefinita del sistema , che potrebbe non essere quella che si desidera utilizzare.)

    Questo funziona bene sulla mia macchina:

     String input = "Aug 31 09:53:19 2011"; DateFormat df = new SimpleDateFormat("MMM dd HH:mm:ss yyyy", Locale.US); System.out.println(df.parseObject(input)); 

    (Usando, ad esempio, ParseException risulta un ParseException .)

    Il formato stesso è OK per l'input che hai dato. Ma si potrebbe get questo errore se la tua impostazione predefinita è impostata su qualcosa in cui "Aug" non è una abbreviazione valida di un nome di mese. Provate a utilizzare ad esempio a Locale.US e vedrai che functionrà:

     DateFormat df = new SimpleDateFormat("MMM dd HH:mm:ss yyyy", Locale.US); Date date = df.parse("Aug 31 09:53:19 2011"); 

    tl; dr

     LocalDateTime ldt = LocalDateTime.parse( "Aug 31 09:53:19 2011" , DateTimeFormatter.ofPattern( "MMM dd HH:mm:ss yyyy" ).withLocale( Locale.US ) ) ; 

    Dettagli

    Le altre due risposte di aioobe e di Jesper sono entrambe corrette: implicitamente utilizzando un locale con un linguaggio umano che non corrisponde alla lingua del text di input.

    Questa risposta spiega un nuovo modo di fare il lavoro. Inoltre, le altre risposte non riguardano il problema cruciale del fuso orario.

    java.time

    Avanzamento veloce alcuni anni dopo da questo post e ora abbiamo il nuovo pacchetto java.time incorporato in Java 8 e versioni successive. Queste nuove classi soppiantano le vecchie classi java.util.Date/.Calendar & SimpleDateFormat. Quelle vecchie classi hanno dimostrato di essere fastidiose, confuse e difettose.

    Formatter Pattern

    Definire i dati da analizzare e il relativo formato.

     String input = "Aug 31 09:53:19 2011"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MMM dd HH:mm:ss uuuu" ); 

    Se non è specificato, DateTimeFormatter viene assegnato il locale che è attualmente il predefinito nel JVM. Quel default può cambiare in qualsiasi momento, anche durante il runtime (!). Quindi specificare sempre il Locale desiderato / previsto.

     formatter = formatter.withLocale( Locale.US ); // Or Locale.UK, Locale.CANADA_FRENCH, etc. 

    Dato che l'input manca di qualsiasi fuso orario o offset-from- UTC informazioni, analizzare come LocalDateTime .

     LocalDateTime ldt = LocalDateTime.parse( input , formatter ); 

    Se dal context conosci il destinato offset da UTC o un fuso orario per questo valore di data-ora, assegnarlo.

    Se UTC, utilizzare la costante ZoneOffset.UTC per get un object OffsetDateTime .

     OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ); 

    Un fuso orario è un offset da UTC e un insieme di regole per gestire anomalie come ora legale (DST). Utilizzare i nomi di fuso orario appropriati , mai le abbreviazioni di 3-4 lettere .

     ZoneId zoneId_Montreal = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ldt.atZone( zoneId_Montreal ); 

    Specificare fuso orario

    Questo elemento della lingua umana era il pezzo chiave mancante per rispondere alla Domanda. Specificare il locale corretto per il linguaggio umano che corrisponde alla lingua della string di input risolve tale problema.

    Ma si noti che il fuso orario è anche critico; le altre risposte ignorano questo problema implicitamente utilizzando la fuso orario attuale di JVM. Ciò non è consigliabile, in quanto dipende dal sistema operativo host come valore iniziale di default (quindi può variare) e inoltre qualsiasi codice in qualsiasi thread di qualsiasi applicazione all'interno del JVM può modificare la zona di ora attuale di JVM durante il runtime. Meglio specificare il fuso orario desiderato / atteso rispetto a implicitamente affidarsi all'impostazione predefinita.

    Oggetti non immutabili

    Nota la syntax. Queste classi sono progettate per essere immutabili . Così, piuttosto che modificare (mutando) un object, viene creato un nuovo object nuovo basato sui valori dell'object precedente. Ciò significa che non stiamo interessando l'object DateTimeFormatter definito in precedenza e detenuto nella variabile del formatter (riferimento dell'object). Stiamo creando, utilizzando e scartando un nuovo object DateTimeFormatter (in realtà, due nuovi oggetti) all'interno di questa linea di codice.

    Metodo di riferimento

    La documentazione suggerisce che un modo alternativo per analizzare una string è quello di call il metodo di parse where passare un riferimento di metodo (nuovo in Java 8) dalla class del tipo di risultato desiderato (come TemporalQuery ): ZonedDateTime::from , LocalDateTime::from , LocalDate::from e così via.

     ZonedDateTime zdt = formatter.withZone( zoneId_Montreal ).withLocale( Locale.ENGLISH ).parse( input, ZonedDateTime :: from ); 

    Per la dimostrazione, torniamo e creiamo una rappresentazione String di quel valore ZonedDateTime ma in Québécois French.

     String output = formatter.withLocale( Locale.CANADA_FRENCH ).format( zdt ); 

    Ancora meglio, localizziamo piuttosto che un codice particolare di un determinato formato.

     String outputLocalized = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ).format( zdt ); 

    Dump alla console.

     System.out.println( "input: " + input ); System.out.println( "formatter: " + formatter ); System.out.println( "zdt: " + zdt ); System.out.println( "output: " + output ); System.out.println( "outputLocalized: " + outputLocalized ); 

    Quando si esegue.

     input: Aug 31 09:53:19 2011 formatter: Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)' 'Value(YearOfEra,4,19,EXCEEDS_PAD) zdt: 2011-08-31T09:53:19-04:00[America/Montreal] output: août 31 09:53:19 2011 outputLocalized: mercredi 31 août 2011 9 h 53 EDT 

    Informazioni su java.time

    Il framework java.time è incorporato in Java 8 e versioni successive. Queste classi soppiantano le vecchie classi di data-time, come java.util.Date , .Calendar , & java.text.SimpleDateFormat .

    Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione a java.time.

    Per ulteriori informazioni, consulta l' Oracle Tutorial . E cerca lo Stack Overflow per molti esempi e spiegazioni.

    Gran parte della funzionalità java.time è back-ported a Java 6 e 7 in ThreeTen-Backport e ulteriormente adattata a Android in ThreeTenABP .

    Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un punto di prova per possibili future aggiunte a java.time.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.