2015-10-30 17 views
6

Jak można sformatować w niestandardowy sposób ciąg znaków?Sposób niestandardowego formatowania FileTime

String s = fileTime.toString() udostępnia tylko w formacie ISO.

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

rzuca UnsupportedTemporalTypeException: Unsupported field: Year

+0

czy miałeś na myśli 'yyyy' zamiast' uuuu' – Kal

+0

@Kal Próbowałem obu. 'yyyy' po prostu rzuca' Unsupported field: Year of Era' zamiast 'Unsupported field: Year'. – Museful

+0

Czy wypróbowałeś 'toMillis' zamiast' toInstant'?Formatowanie 'Instant' wymaga strefy czasowej. – Kal

Odpowiedz

2

Nie można sformatować jednej chwili za pomocą DateTimeFormatter instancji odpytywanie roku.

Numer Instant reprezentuje pojedynczy punkt na linii czasu. Dlatego nie można podać prawidłowej/unikalnej odpowiedzi na pytanie "jaki jest rok/dzień/czas?". To zależy od tego, gdzie na świecie pytanie jest zadawane: W Nowym Jorku różni się od Sidney. Ale Your DateTimeFormatter zadaje właśnie to pytanie. I dlatego otrzymujesz UnsupportedTemporalTypeException.

Trzeba przekonwertować Instance Do LocalDateTime co najmniej:

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

Jeśli czas wygląda tak

2015-01-01T10:10:09 

Korzystanie

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

To nie jest to, o co prosiłem. – Museful

2

Formatowanie Instant wymaga czasu -strefa. Można to osiągnąć stosując withZone(ZoneId):

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

Osobiście uważam, że komunikat o błędzie „Pole nieobsługiwany: Year” mylące. Prawdziwą przyczyną jest brak strefy czasowej. Ta informacja jest potrzebna, aby pomóc formaterowi w wewnętrznym przekształceniu danej chwili w reprezentację czasu ludzkiego. Rozwiązanie: Podaj strefę czasową. Następnie obsługiwane jest formatowanie lub parsowanie Instant - w przeciwieństwie do odpowiedzi @flo.

Druk:

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 

analizowaniem:

Odwrotna procedura - parsowania - czy niestety nie działają w ten sam bezpośredni sposób, ponieważ silnik format java.time jest zaprojektowany tak, że formater tylko zwraca surowy TemporalAccessor, który należy przekonwertować na wymagany wymagany typ. Przykład:

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 

Jeżeli sygnał wejściowy jest analizowany zawiera strefy czasowej lub identyfikator, a następnie można modyfikować wzór (symboli X, X, Z, Z, VV itd.) I pozostawić na wywołanie withZone(...), aw przypadku przesunięć - naprawdę powinieneś pominąć to wezwanie, ponieważ w przeciwnym razie formater nie użyje przesunięcia strefy czasowej twojego wejścia, ale dostarczonej jednej strefy (pułapka, którą zaobserwowałem we własnych testach).

Powiązane problemy