Как да форматирате по избор FileTime

При даден FileTime fileTime, как може да бъде форматиран по персонализиран начин до низ?

String s = fileTime.toString() го предоставя само в ISO формат.

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

хвърля UnsupportedTemporalTypeException: Unsupported field: Year


person Museful    schedule 30.10.2015    source източник
comment
имахте предвид yyyy вместо uuuu   -  person Kal    schedule 30.10.2015
comment
@Kal пробвах и двете. yyyy просто хвърля Unsupported field: Year of Era вместо Unsupported field: Year.   -  person Museful    schedule 30.10.2015
comment
Опитахте ли toMillis вместо toInstant? Форматирането на Instant изисква часова зона.   -  person Kal    schedule 30.10.2015
comment
@Kal Опитах това. Как би се процедирало с резултата от toMillis?   -  person Museful    schedule 30.10.2015
comment
а, да. Мисля, че най-добрият ви залог е просто да прикачите часова зона към DateTimeFormatter -- stackoverflow .com/questions/25229124/format-instant-to-string   -  person Kal    schedule 30.10.2015


Отговори (5)


Не можете да форматирате Instant, като използвате екземпляр DateTimeFormatter, заявяващ годината.

Instant представлява една точка от времевата линия. Ето защо не е възможно да се даде правилен/еднозначен отговор на въпроса "коя е годината/денят/часът?". Зависи къде по света е зададен въпросът: В Ню Йорк се различава от Сидни. Но вашият DateTimeFormatter задава точно този въпрос. И затова получавате UnsupportedTemporalTypeException.

Трябва да преобразувате Instance в LocalDateTime поне:

System.out.println(timestampFormatter.format(
    LocalDateTime.ofInstant(fileTime.toInstant(), ZoneId.systemDefault()));
person flo    schedule 30.10.2015

Лично аз намирам съобщението за грешка „Неподдържано поле: Година“ за подвеждащо. Истинската причина е липсата на часова зона. Тази информация е необходима, за да помогне на форматиращия вътрешно да преобразува дадения момент в представяне на човешко време. Решение: Въведете часовата зона. След това форматирането или анализирането на Instant се поддържа - за разлика от отговора на @flo.

Печат:

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

Синтактичен анализ:

Обратната процедура - парсирането - за съжаление не работи по същия директен начин, тъй като машината за форматиране на java.time е проектирана така, че форматиращият връща само необработен TemporalAccessor, който трябва да бъде преобразуван в реалния изискван тип. Пример:

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

Ако входът, който трябва да бъде анализиран, съдържа отместване на часовата зона или идентификатор, тогава можете да промените модела (символи x, X, z, Z, VV и т.н.) и да оставите извикването на withZone(...), а в случай на отмествания - наистина трябва пропуснете това извикване, защото в противен случай форматиращият няма да използва отместването на часовата зона на вашия вход, а предоставената една зона (клопка, която наблюдавах в собствените си тестове).

person Meno Hochschild    schedule 30.10.2015

Форматирането на Instant изисква часова зона. Това може да се постигне с помощта на withZone(ZoneId):

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

Ако вашето време изглежда така

2015-01-01T10:10:09

Използвайте

yyyy-MM-dd'T'HH:mm:ss
person Enzokie    schedule 30.10.2015
comment
Не това попитах. - person Museful; 30.10.2015

ZonedDateTime може да анализира низа по подразбиране, който получавате от FileTime.toString(): (посочете свой собствен „път“ в кодовия фрагмент по-долу)

FileTime fileTime = Files.getLastModifiedTime(path);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(fileTime.toString());
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEEE, MMMM d, yyyy   HH:mm:ss");   
System.out.println(dtf.format(zonedDateTime));

Резултат: събота, 18 април 2020 г. 13:43:29

person selofain    schedule 18.04.2020