Java >> Java tutorial >  >> Java

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());

Java tag