2015-06-10 17 views
15

sono riuscito ad analizzare un String a un oggetto LocalDate:JDK8: in grado di analizzare LocalTime

DateTimeFormatter f1=DateTimeFormatter.ofPattern("dd MM yyyy"); 
LocalDate d=LocalDate.parse("26 08 1984",f1); 
System.out.println(d); //prints "1984-08-26" 

Ma non posso fare lo stesso con LocalTime. Questo pezzo di codice:

DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm"); 
LocalTime t=LocalTime.parse("11 08",f2); //exception here 
System.out.println(t); 

Genera un DateTimeParseException: sbagliato

Exception in thread "main" java.time.format.DateTimeParseException: Text '11 08' could not be parsed: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type java.time.format.Parsed 
    at java.time.format.DateTimeFormatter.createError(Unknown Source) 
    at java.time.format.DateTimeFormatter.parse(Unknown Source) 
    at java.time.LocalTime.parse(Unknown Source) 
    at com.mui.cert.Main.<init>(Main.java:21) 
    at com.mui.cert.Main.main(Main.java:12) 
Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type java.time.format.Parsed 
    at java.time.LocalTime.from(Unknown Source) 
    at java.time.LocalTime$$Lambda$15/1854731462.queryFrom(Unknown Source) 
    at java.time.format.Parsed.query(Unknown Source) 
    ... 4 more 

Che cosa sto facendo?

risposta

14

Se si utilizza un formato specifico, secondo a API:

La stringa deve rappresentare un orario valido ed è analizzata utilizzando DateTimeFormatter.ISO_LOCAL_TIME.

hh mm 

per 24h deve essere

HH mm 

o per 12h

kk mm 

I formati gestiti devono avere queste condizioni:

  • Due cifre per l'ora- del giorno. Questo è preimpostato da zero per garantire due cifre.
  • A due punti
  • Due cifre per il minuto dell'ora. Questo è preimpostato da zero per garantire due cifre.
  • Se il secondo minuto non è disponibile, il formato è completo.
  • A due punti
  • Due cifre per il secondo minuto. Questo è preimpostato da zero per garantire due cifre.
  • Se il nano-secondo è zero o non disponibile, il formato è completo.
  • Un punto decimale
  • Da uno a nove cifre per il nano-secondo. Come molte cifre saranno prodotte come richiesto.
+0

Puoi collegare la risorsa per favore? –

+1

Certo ... fatto! :) –

+3

È interessante, ho pensato che potrei pasticciare indefinitamente con l'ordine degli elementi ... –

1

è necessario utilizzare il capitale HH nel modello

DateTimeFormatter f2=DateTimeFormatter.ofPattern("HH mm"); 

o fare questo, per clock-hour-of-am-pm è necessario specificarlo.

Questo dovrebbe funzionare anche

DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm a"); 
LocalTime t=LocalTime.parse("11 08 AM",f2); //exception here 
+0

funziona ... ma perché? 'h -> clock-hour-of-am-pm' dovrebbe funzionare anche! –

+1

Penso che la parte 'am-pm' sia importante - può fare riferimento a due distinti LocalTimes (uno per am e uno per pm) – Deltharis

2

Usa DateTimeFormatter.ofPattern("kk mm"); per 12 ora orologio o DateTimeFormatter.ofPattern("HH mm") per orologio a 24 ore

Se si desidera analizzare il tempo con hh è necessario combinare wih a dove si definisce AM o PM:

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm a"); 
LocalTime t = LocalTime.parse("11 08 AM", f2); 
2

In questo caso Unable to obtain LocalTime from TemporalAccessor significa che non è possibile determinare il quale misura attraverso il giorno stringa data rappresenta cioè non c'è abbastanza informazioni per costruire un LocalTime. Dietro le quinte, il codice simile a questa versione ampliata Java 8 (che dà un errore simile):

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm"); 
TemporalAccessor temporalAccessor = f2.parse("11 08"); 
LocalTime t = temporalAccessor.query(LocalTime::from); 
System.out.println(t); 

La documentazione LocalTime::from dice

La conversione utilizza la query TemporalQueries.localTime(), che si basa sull'estrazione del campo NANO_OF_DAY.

vostro errore vi sta dicendo che l'TemporalAccessor ha solo due campi, nessuno dei quali è un campo NANO_OF_DAY. I modelli minima consentita per il recupero di un LocalTime utilizzando un DateTimeFormatter sono:

DateTimeFormatter.ofPattern("ha"); 
DateTimeFormatter.ofPattern("Ka"); 
DateTimeFormatter.ofPattern("ah"); 
DateTimeFormatter.ofPattern("aK"); 
DateTimeFormatter.ofPattern("k"); 
DateTimeFormatter.ofPattern("H"); 

vostro modello deve contenere almeno una di queste stringhe per ottenere un campo NANO_OF_DAY nel interna TemporalAccessor da cui un LocalTime possono essere costruiti.

Problemi correlati