Разбор Java LocalDateTime - PullRequest
       35

Разбор Java LocalDateTime

4 голосов
/ 14 марта 2019

Почему я могу проанализировать строку даты и времени в 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 выдает ошибку.

Где as

LocalDateTime aDate = LocalDateTime.parse("2019-01-01T24:00:00"); //throws an error

Выдает ошибку - значение HourOfDay должно быть в диапазоне от 0 до 23- как и ожидалось

1 Ответ

4 голосов
/ 14 марта 2019

ResolverStyle

Поскольку DateTimeFormatter.ofPattern() по умолчанию равно ResolverStyle.SMART, если стиль распознавателя не указан. SMART допускает некоторые преобразования. 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
...