Java DateTimeFormatter
генерирует исключение для того, когда вы пытаетесь дату, которая выходит за пределы возможного диапазона, например:DateTimeFormatter автоматически корректирует дату недействителен (синтаксически возможно) календарь
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/yyyy");
String dateString = "12/32/2015";
LocalDate ld = LocalDate.parse(dateString, dtf);
отбросит:
Exception in thread "main" java.time.format.DateTimeParseException: Text '12/32/2015' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32
Но когда я ввести неверную дату календаря, который по-прежнему синтаксически возможно по их меркам, это autocorrects, чтобы быть действительной датой, например:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/yyyy");
String dateString = "2/31/2015";
LocalDate ld = LocalDate.parse(dateString, dtf);
он успешно разбирает, но автоподтверждает 2015-02-28
. Я не хочу этого поведения, я хочу, чтобы он все еще выдавал исключение, когда дата не является действительной датой календаря. Есть ли встроенный параметр, который я могу установить для этого, или мне действительно нужно попытаться вручную отфильтровать эти экземпляры?
Это дает мне другое исключение: 'Text '2/28/2015' не может быть разобран: Невозможно получить LocalDate из TemporalAccessor: {DayOfMonth = 28, YearOfEra = 2015, MonthOfYear = 2}, типа ISO java.time.format.Parsed' – aconkey
В сообщении говорится, что эпоха отсутствует - в строгом режиме она больше не по умолчанию. Вам нужно использовать 'DateTimeFormatterBuilder' и' parseDefaulting (ChronoField.ERA, IsoEra.CE.getValue()) 'http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatterBuilder .html # parseDefaulting-java.time.temporal.TemporalField-long- – JodaStephen
Не можем ли мы просто заменить 'yyyy'' uuuu' в этом случае? – assylias