Почему я могу разобрать строку времени даты в Java с некорректным часом? Что я пропустил или нужно сделать, чтобы убедиться, что он выдает ошибку соответствующим образом.
Следующий код не выдаст ошибку, где он должен?
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
LocalDateTime aFormattedDate = LocalDateTime.parse("2019-01-01T24:00:00", dateTimeFormatter); // returns 2019-01-02T00:00:00, should throw an error
Указание час в 25, или в том числе и любую миллисекунды или другой компонент времени делает причину parse
бросить ошибку.
В то время как
LocalDateTime aDate = LocalDateTime.parse("2019-01-01T24:00:00"); //throws an error
Имеет ли выдаст ошибку - о HourOfDay должна находиться в диапазоне от 0 до 23 - как и ожидалось
ResolverStyle
Поскольку по DateTimeFormatter.ofPattern()
умолчанию в ResolverStyle.SMART
случае , если стиль распознаватель не указан. SMART
позволяет некоторым conversionse.g. 24:00:00
будет преобразован в следующий день , но 24:00:01
будет сгенерировано исключение. Согласно перечислений Javadoc:
Стиль к датам решительности и времени в интеллектуальной, или умной, манере.
Использование смарта-разрешения будет выполнять разумное значение по умолчанию для каждого поля, которое может быть таким же, как строгие, так же, как мягко, или третье поведением. Отдельные поля будут интерпретировать это по-разному.
Например, разрешение год-месяц и день-месяц в календарной системе ISO, используя интеллектуальный режим гарантирует, что день-месяц составляет от 1 до 31, превращая любое значение за последний действительный день-месяц, чтобы быть последний действительный день-месяц.
LocalDateTime.parse()
использует ResolveStyle.STRICT
под капотом , что делает его эквивалент:
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss")
.withResolverStyle(ResolverStyle.STRICT);
LocalDateTime.parse("2019-01-01T24:00:00", fmt); // DateTimeParseException