2014-08-27 11 views
6

Ho appena provato a analizzare un tempo semplice! Ecco il mio codice:java.text.ParseException: Data non analizzabile: "01:19 PM"

String s = "01:19 PM"; 
     Date time = null; 
     DateFormat parseFormat = new SimpleDateFormat("hh:mm aa"); 
     try { 
      time = parseFormat.parse(s); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

sto ottenendo questa eccezione:

java.text.ParseException: Unparseable date: "01:19 PM" 
    at java.text.DateFormat.parse(Unknown Source) 
+0

Quale versione di Java stai usando? Il tuo codice funziona in Java 8. –

+0

Nessuna eccezione con jdk 7 qui !!! –

+0

Solo per confermare l'interrogante: ottengo anche l'eccezione usando Java 1.7.0_55. – icza

risposta

5

Questo funziona:

public static void main(String[] args) throws Exception { 
    String s = "01:19 PM"; 
    Date time = null; 
    DateFormat parseFormat = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); 
    System.out.println(time = parseFormat.parse(s)); 
    } 

ouputs:

Thu Jan 01 13:19:00 KST 1970 
+0

Non funziona per me, come l'originale – icza

+0

Forse c'è un problema con il tuo Locale? Ho aggiunto il campo al costruttore SDF –

+0

Non funziona! – KostasC

1

penso che invece di "hh:mm aa" dovrebbe essere "h:mm a"

+0

Dà lo stesso errore (eccezione). – icza

+0

Sto ottenendo la stessa eccezione! Grazie per la tua risposta – KostasC

0

Secondo il official documentation si dovrebbe usare questa stringa di formato: "h:mm a"

Ma anche la stringa di formato è corretta perché non ricevo errori durante l'esecuzione del codice.

+0

Dà lo stesso errore (eccezione). – icza

0

Prova questo formato: "K:m a"

Controllare la documentazione anche: SimpleDateFormat
Inoltre, controllare il vostro locale, il problema sembra essere specifica locale.

+1

Sia 'K' che' h' sono validi, solo 'K' è nell'intervallo di' 0..11' e 'h' è nell'intervallo di' 1..12'. – icza

+0

La stessa eccezione! :( – KostasC

5

Il modello di lettera a è il marcatore AM/PM, ma è locale specifica. Ovviamente AM e PM sono validi nelle impostazioni locali in inglese, ma non sono validi nella locale ungherese, ad esempio.

Si ottiene ParseException perché si dispone di un locale non inglese impostato, e nelle impostazioni internazionali PM non è valido.

// This is OK, English locale, "PM" is valid in English 
Locale.setDefault(Locale.forLanguageTag("en")); 
new SimpleDateFormat("hh:mm aa").parse("01:19 PM"); 

// This will throw Exception, Hungarian locale, "PM" is invalid in Hungarian 
Locale.setDefault(Locale.forLanguageTag("hu")); 
new SimpleDateFormat("hh:mm aa").parse("01:19 PM"); 

Per ovviare a questo problema, il Locale può essere specificato nel costruttore: risposta

// No matter what is the default locale, this will work: 
new SimpleDateFormat("hh:mm aa", Locale.US).parse("01:19 PM"); 
2

LocalTime

moderna utilizzando LocalTime classe.

LocalTime time = null; 
DateTimeFormatter parseFormatter 
    = DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH); 
try { 
    time = LocalTime.parse(s, parseFormatter); 
} catch (DateTimeParseException dtpe) { 
    System.out.println(dtpe.getMessage()); 
} 

Questo disattiva la stringa dalla domanda, 01:19 PM, in un LocalTime pari a 13:19.

Abbiamo ancora bisogno di fornire il locale. Dal momento che i marcatori AM/PM sono difficilmente utilizzati nella pratica in altre lingue oltre all'inglese, ho considerato Locale.ENGLISH una scommessa abbastanza sicura. Per favore sostituisci il tuo.

Già quando questa domanda è stata posta nel 2014, la sostituzione moderna per le vecchie classi Date e SimpleDateFormat era fuori, la moderna API di data e ora Java. Oggi considero obsolete le vecchie classi e raccomando caldamente di usare quelle moderne. Hanno generalmente dimostrato di essere notevolmente più programmabili e convenienti da utilizzare.

Solo per una cosa semplice, se non riusciamo a fornire un locale su un sistema con una locale predefinita che non riconosce AM e PM, il formattatore moderno ci darà un'eccezione con il messaggio Text '01:19 PM' could not be parsed at index 6. L'indice 6 è dove si dice PM, quindi siamo già in viaggio. Sì, lo so che lo è un modo per ottenere l'indice dall'eccezione generata dalla classe obsoleta, ma la maggior parte dei programmatori non è mai stata consapevole e quindi non l'ha usata.

Ancora più importante, la nuova API offre una classe LocalTime che ci offre ciò che vogliamo e di cui abbiamo bisogno qui: solo l'ora del giorno senza la data. Questo ci consente di modellare i nostri dati in modo molto più preciso. Ci sono un certo numero di domande su Stack Overflow causate dalla confusione a sua volta causate dal fatto che uno Date include necessariamente sia la data che l'ora quando a volte si desidera solo l'una o l'altra.

Problemi correlati