2015-09-28 13 views
6

Ho creato questo meraviglioso metodo statico ieri, e ha funzionato bene - ieriParsing ISO_INSTANT e simili Data Ora Strings

Tuttavia, oggi mi dà questo errore. Immagino che provenga da troppi 0 prima della Z.

Qualcuno può consigliare come analizzare in modo conciso (Java 8) questo tipo di data di formato String - tenendo presente che ha funzionato anche ieri, quindi ISO_INSTANT è anche un formato valido per lo String?

Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed 
at java.time.LocalDate.from(LocalDate.java:368) 
at java.time.LocalDateTime.from(LocalDateTime.java:456) 
... 9 more 

un'eccezione in orario di ingresso: "2015-09-28T14: 46: 44.000000Z"

/** 
* 
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z") 
* @return 
*/ 
public static LocalDateTime parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return LocalDateTime.from(f.parse(time)); 
} 

enter image description here

+0

ISO_INSTANT non supporta fusi orari, può essere fissato con qualcosa di simile come segue: 'Instant.from (DateTimeFormatter.ISO_DATE_TIME.parse (" 2017-04-20T00: 00: 00 + 04: 00 "))' –

risposta

11

Si analizza una stringa che è coerente con un attimo ISO quindi è necessario memorizzare il risultato in una Instant invece di LocalDateTime:

public static Instant parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from); 
} 

Si noti che questo formattatore gestisce correttamente i secondi frazionari, quindi non è necessario rimuoverli. Citazioni DateTimeFormatter.ISO_INSTANT Javadoc (emphasis mine):

Durante l'analisi, è necessario il tempo per il campo almeno dei secondi. Vengono analizzati i secondi frazionari da zero a nove.

Quanto al perché ha funzionato ieri e non oggi, non ho idea ...

+0

grazie, e va bene fare 'LocalDateTime.from (instant);'? il mio codice è in realtà in attesa del formato LocalDateTime. i nanosecondi non sono importanti – ycomp

+2

@ycomp È possibile convertire un Instant a LocalDateTime, vedere [questa risposta] (http://stackoverflow.com/a/19726814/1743880). – Tunaki

+0

forse l'ho appena codificato ieri, pensavo di averlo eseguito, ma non l'ho mai eseguito fino ad oggi - non riesco a vedere nulla nel mio codice che indica che sarei stato in grado di eseguirlo ieri .. quindi immagino che non abbia mai funzionato nel modo giusto L'ho originariamente codificato – ycomp

3

Solo per il gusto di aiutare qualcuno a vedere questa domanda più tardi.

È necessario analizzare la Data ISO come Instant, convertirla in Oggetto Instant e quindi creare un LocalDateTime da esso fornendo l'Id di zona. Sto impostando l'id della zona di UTC qui.

Il codice è

public static LocalDateTime getISODate(String dateString) { 
    DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT; 
    Instant dateInstant = Instant.from(isoFormatter.parse(dateString)); 
    LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId())); 

    return date; 
}