Sådan tilpasses formatering af en FileTime
Personligt finder jeg fejlmeddelelsen "Unsupported field:Year" misvisende. Den egentlige årsag er manglende tidszone. Disse oplysninger er nødvendige for at hjælpe formatereren til internt at konvertere det givne øjeblik til en menneskelig-tids-repræsentation. Løsning:Angiv tidszonen. Derefter formateres eller analyseres en Instant
er understøttet - i modsætning til svaret fra @flo.
Udskrivning:
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
Parsing:
Den omvendte procedure - parsing - fungerer desværre ikke på samme direkte måde, fordi formatmaskinen for java.time
er designet sådan, at formateringsværktøjet kun returnerer en rå TemporalAccessor
som skal konverteres til den rigtige påkrævede type. Eksempel:
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
Hvis input, der skal parses, indeholder en tidszoneforskydning eller en identifikator, kan du ændre mønsteret (symboler x, X, z, Z, VV osv.) og udelade opkaldet til withZone(...)
, og i tilfælde af forskydninger - du bør virkelig udelade det opkald, fordi ellers vil formateringsværktøjet ikke bruge tidszoneforskydningen for dit input, men den leverede ene zone (en faldgrube jeg observerede i mine egne tests).
Du kan ikke formatere et øjeblik med en DateTimeFormatter
instans, der forespørger om året.
En Instant
repræsenterer et enkelt punkt på tidslinjen. Derfor er det ikke muligt at give et korrekt/entydigt svar på spørgsmålet "hvad er år/dag/klokkeslæt?". Det afhænger af, hvor i verden spørgsmålet stilles:I New York adskiller det sig fra Sidney. Men din DateTimeFormatter stiller præcis dette spørgsmål. Og det er derfor, du får en UnsupportedTemporalTypeException
.
Du skal konvertere Instance
til en LocalDateTime
i det mindste:
System.out.println(timestampFormatter.format(
LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault()));
Formatering af en Instant
kræver en tidszone. Dette kan opnås ved at bruge withZone(ZoneId)
:
String s = DateTimeFormatter.ofPattern("uuuu-MMM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault())
.format(fileTime.toInstant());