Как настроить формат 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