Я играл с новым API даты и времени, но при запуске:
public class Test {
public static void main(String[] args){
String dateFormatted = LocalDate.now()
.format(DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateFormatted);
}
}
Выбрасывает:
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2543)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDate.format(LocalDate.java:1685)
at Test.main(Test.java:23)
Глядя на исходный код класса LocalDate, я вижу:
private int get0(TemporalField field) {
switch ((ChronoField) field) {
case DAY_OF_WEEK: return getDayOfWeek().getValue();
case ALIGNED_DAY_OF_WEEK_IN_MONTH: return ((day - 1) % 7) + 1;
case ALIGNED_DAY_OF_WEEK_IN_YEAR: return ((getDayOfYear() - 1) % 7) + 1;
case DAY_OF_MONTH: return day;
case DAY_OF_YEAR: return getDayOfYear();
case EPOCH_DAY: throw new UnsupportedTemporalTypeException("Invalid field 'EpochDay' for get() method, use getLong() instead");
case ALIGNED_WEEK_OF_MONTH: return ((day - 1) / 7) + 1;
case ALIGNED_WEEK_OF_YEAR: return ((getDayOfYear() - 1) / 7) + 1;
case MONTH_OF_YEAR: return month;
case PROLEPTIC_MONTH: throw new UnsupportedTemporalTypeException("Invalid field 'ProlepticMonth' for get() method, use getLong() instead");
case YEAR_OF_ERA: return (year >= 1 ? year : 1 - year);
case YEAR: return year;
case ERA: return (year >= 1 ? 1 : 0);
}
throw new UnsupportedTemporalTypeException("Unsupported field: " + field);
}
Как описано в документе:
Этот метод создаст средство форматирования на основе простого шаблона букв и символов, как описано в документации класса.
И все эти буквы определены .
Так почему DateTimeFormatter.ofPattern
же мы не можем использовать несколько шаблонных букв?
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfWeek
DateTimeFormatter.ofPattern("HH:mm:ss")
К правильному ответу @James_D я хотел бы добавить следующие детали:
Справочная информация: Большинство библиотек даты и времени (
java.util.Calendar
в Java, см. Также .Net-DateTime,Date
в JavaScript илиDateTime
Perl) основаны на концепции универсального универсального уникального временного типа (на немецком языке есть поэтическое выражение " eierlegende Wollmilchsau "). В этом дизайне не может быть неподдерживаемого поля. Но цена высока: многие временные проблемы не могут быть адекватно решены с помощью такого негибкого подхода, потому что трудно или невозможно найти общий знаменатель для всех видов временных объектов.JSR-310 выбрал другой способ , а именно, разрешить различные временные типы, которые состоят из зависящих от типа наборов поддерживаемых встроенных полей. Естественным следствием является то, что не все возможные поля поддерживаются каждым типом (и пользователи могут даже определять свои собственные специализированные поля). Также можно программно запросить у каждого объекта типа
TemporalAccessor
определенный набор поддерживаемых полей. ИбоLocalDate
мы находим:Нет поля HOUR_OF_DAY, которое объясняет проблему
UnsupportedTemporalTypeException
. И если мы посмотрим на отображение JSR-310- символов шаблона в поля, мы увидим, что символ H отображается в неподдерживаемый HOUR_OF_DAY:Это отображение поля не означает, что поле поддерживается конкретным типом. Разбор происходит в несколько этапов. Отображение полей - это только первый шаг. На втором этапе выполняется синтаксический анализ необработанного объекта типа
TemporalAccessor
. И, наконец, анализирует делегатов целевого типа (здесь :)LocalDate
и позволяет ему решать, принимает ли он все значения полей в проанализированном промежуточном объекте.источник
Правильный класс для меня был,
ZonedDateTime
который включает как время, так и часовой пояс.LocalDate
не имеет информации о времени, поэтому вы получите файлUnsupportedTemporalTypeException: Unsupported field: HourOfDay
.Вы можете использовать,
LocalDateTime
но тогда у вас нет информации о часовом поясе, поэтому, если вы попытаетесь получить к ней доступ (даже с помощью одного из предопределенных форматеров), вы получите файлUnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
.источник