2015-10-30 4 views
6

Учитывая, что 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

+0

Вы имели в виду 'yyyy' вместо' uuuu' – Kal

+0

@Kal Я пробовал оба. 'yyyy' просто бросает' Неподдерживаемое поле: Год эры' вместо 'Неподдерживаемого поля: Год'. – Museful

+0

Вы попробовали 'toMillis' вместо' toInstant'?Для форматирования 'Instant' требуется часовой пояс. – Kal

ответ

2

Вы не можете форматировать Instant используя DateTimeFormatter экземпляр запрашивая год.

Instant представляет собой единую точку на временной линии. Поэтому невозможно дать правильный/уникальный ответ на вопрос «какой год/день/время?». Это зависит от того, где в мире задается вопрос: в Нью-Йорке он отличается от Сиднея. Но ваш вопрос DateTimeFormatter задает именно этот вопрос. И именно поэтому вы получаете UnsupportedTemporalTypeException.

Вы должны преобразовать Instance к LocalDateTime по крайней мере:

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

Если ваше время выглядит следующим образом

2015-01-01T10:10:09 

Использование

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

Это не то, что я спросил. – Museful

2

Форматирование Instant требует времени -zone. Это может быть достигнуто с помощью withZone(ZoneId):

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

Лично я нахожу сообщение об ошибке «неподдерживаемый поле: Год» вводит в заблуждение. Реальная причина отсутствует часовой пояс. Эта информация необходима, чтобы помочь форматировщику внутренне преобразовать данный момент в представление времени человека. Решение: поставьте часовой пояс. Поддерживается форматирование или разбор 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, В. В. и др) и оставить из призыв к withZone(...), и в случае смещения - вы действительно должны отказаться от этого вызова, потому что в противном случае форматировщик не будет использовать смещение часового пояса вашего входа, кроме предоставленной одной зоны (я обнаружил ошибку в своих тестах).