Personalmente trovo il messaggio di errore "campo non supportato: Anno" fuorviante. La vera causa manca il fuso orario. Queste informazioni sono necessarie per aiutare il formattatore a convertire internamente l'istante dato in una rappresentazione tempo-umana. Soluzione: fornire il fuso orario. Quindi è supportata la formattazione o l'analisi di Instant
, in contrasto con la risposta di @flo.
stampa:
String s =
DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss", Locale.ENGLISH)
.withZone(ZoneId.systemDefault())
.format(Instant.now());
System.out.println(s); // 2015-Oct-30 15:22:32
di analisi:
La procedura inversa - analisi - non purtroppo non funziona allo stesso modo diretto perché il motore formato java.time
è stato progettato in modo tale che il formattatore unica restituisce un grezzo TemporalAccessor
che deve essere convertito nel tipo richiesto reale. Esempio:
Instant instant =
Instant.from(
DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss", Locale.ENGLISH)
.withZone(ZoneId.systemDefault())
.parse("2015-Oct-30 15:22:32"));
System.out.println("=>" + instant); // 2015-10-30T14:22:32Z
Se l'ingresso da analizzare contiene un offset o un identificatore allora è possibile modificare il modello fuso orario (simboli X, X, Z, Z, ecc VV) e lasciare la chiamata a withZone(...)
, e in caso di offset - dovresti davvero lasciare fuori quella chiamata perché altrimenti il formattatore non userà l'offset del fuso orario del tuo input ma la zona fornita (una trappola che ho osservato nei miei test).
fonte
2015-10-30 14:56:59
intendevi "yyyy" invece di "uuuu" – Kal
@Kal Ho provato entrambi. 'yyyy' getta' Campo non supportato: Anno dell'era' invece di 'Campo non supportato: Anno'. – Museful
Hai provato 'toMillis' invece di' toInstant'?La formattazione di un 'Instant' richiede il fuso orario. – Kal