2015-10-30 15 views
6

Dato un FileTime fileTime, come può essere formattato in modo personalizzato su una stringa?Come formattare un FileTime personalizzato

String s = fileTime.toString() lo fornisce solo in formato ISO.

String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss") 
           .format(fileTime.toInstant()); 

tiri UnsupportedTemporalTypeException: Unsupported field: Year

+0

intendevi "yyyy" invece di "uuuu" – Kal

+0

@Kal Ho provato entrambi. 'yyyy' getta' Campo non supportato: Anno dell'era' invece di 'Campo non supportato: Anno'. – Museful

+0

Hai provato 'toMillis' invece di' toInstant'?La formattazione di un 'Instant' richiede il fuso orario. – Kal

risposta

2

Non è possibile formattare un istante utilizzando un'istanza DateTimeFormatter interrogare l'anno.

Un Instant rappresenta un singolo punto sulla linea del tempo. Ecco perché non è possibile dare una risposta corretta/unica alla domanda "che anno/giorno/ora?". Dipende da dove viene posta la domanda al mondo: a New York differisce da Sidney. Ma il tuo DateTimeFormatter chiede esattamente questa domanda. Ed è per questo che ottieni uno UnsupportedTemporalTypeException.

È necessario convertire il Instance ad un LocalDateTime almeno:

System.out.println(timestampFormatter.format(
    LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault())); 
1

Se il vostro tempo è simile al seguente

2015-01-01T10:10:09 

Usa

yyyy-MM-dd'T'HH:mm:ss 
+0

Questo non è quello che ho chiesto. – Museful

2

formattazione di una Instant richiede un tempo -zona. Ciò può essere ottenuto utilizzando withZone(ZoneId):

String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss") 
       .withZone(ZoneId.systemDefault()) 
       .format(fileTime.toInstant()); 
5

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).