Научитесь разбирать строки даты и времени на экземпляры LocalDate и LocalDateTime, используя строгий стиль, используя параметр ResolverStyle.STRICT с экземпляром DateTimeFormatter.
1. ResolverStyle – Анализ стилей
На сегодняшний день разбор строки в Java происходит в два этапа:
- Фаза 1 — это базовый разбор текста в соответствии с полями, добавленными в конструктор. Он просто проверяет, что отдельные поля в строке даты(например, день, месяц, год и т. д.) имеют смысл.
- Фаза 2 разрешает проанализированные пары поле-значение в объекты даты и/или времени. Здесь Java пытается создать фактические объекты даты и времени с предоставленной информацией в строке даты.
ResolverStyle — это перечисление, используемое для управления тем, как происходит фаза 2, разрешение. Он содержит три стиля разбора:
- СКЛОНЧИВЫЙ – Стиль, позволяющий смягчить требования к датам и времени.
2019-02-27 - is parsed to - 2019-02-272019-02-28 - is parsed to - 2019-02-282019-02-29 - is parsed to - 2019-03-01 //Date moved to next month
- УМНЫЙ – Стиль, позволяющий разумно, или интеллектуально, определять даты и время.
2019-02-27 - is parsed to - 2019-02-272019-02-28 - is parsed to - 2019-02-282019-02-29 - is parsed to - 2019-02-28 //Date adjusted based on smart guessing
- СТРОГИЙ – Стиль для строгого указания дат и времени.
2019-02-27 - is parsed to - 2019-02-272019-02-28 - is parsed to - 2019-02-282019-02-29 - is parsed to - //java.time.format.DateTimeParseException
2. Строгий анализ LocalDate
Программа Java для разбора строки даты в экземпляр LocalDate с использованием строгого формата. Она выдаст ошибки на недопустимых датах, таких как 30 февраля.
Java 8 использует 'uuuu' для года, а не 'yyyy'. В Java 8 'yyyy' означает «год эры»(до н.э. или н.э.).
import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.time.format.ResolverStyle;public class Main{static DateTimeFormatter DATE_FORMATTER= DateTimeFormatter.ofPattern("uuuu-MM-dd");public static void main(String[] args){System.out.println("Parsed Date :: " + parseDate("2019-02-27"));System.out.println("Parsed Date :: " + parseDate("2019-02-28"));System.out.println("Parsed Date :: " + parseDate("2019-02-29"));}private static LocalDate parseDate(String dateString){LocalDate parsedDate = LocalDate.parse(dateString,DATE_FORMATTER.withResolverStyle(ResolverStyle.STRICT));return parsedDate;}}]
Вывод программы.
Parsed Date :: 2019-02-27Parsed Date :: 2019-02-28Exception in thread "main" java.time.format.DateTimeParseException:Text '2019-02-29' could not be parsed: Invalid date 'February 29' as '2019' is not a leap yearat java.time.format.DateTimeFormatter.createError(Unknown Source)
3. Строгий анализ LocalDateTime
Программа Java для анализа строки даты и времени в экземпляр LocalDateTime с использованием строгого формата.
import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;import java.time.format.ResolverStyle;public class Main{static DateTimeFormatter DATE_FORMATTER= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSS");public static void main(String[] args){System.out.println("Parsed DateTime :: " + parseDateTime("2019-02-27T11:23:56.1234"));System.out.println("Parsed DateTime :: " + parseDateTime("2019-02-28T11:23:56.1234"));System.out.println("Parsed DateTime :: " + parseDateTime("2019-02-29T11:23:56.1234"));}private static LocalDateTime parseDateTime(String dateString){LocalDateTime parsedDateTime = LocalDateTime.parse(dateString,DATE_FORMATTER.withResolverStyle(ResolverStyle.STRICT));return parsedDateTime;}}
Вывод программы.
Parsed DateTime :: 2019-02-27T11:23:56.123400Parsed DateTime :: 2019-02-28T11:23:56.123400Exception in thread "main" java.time.format.DateTimeParseException:Text '2019-02-29T11:23:56.1234' could not be parsed: Invalid date 'February 29' as '2019' is not a leap yearat java.time.format.DateTimeFormatter.createError(Unknown Source)
Пишите мне в комментариях свои вопросы, связанные с проверкой того, содержит ли строка дату, в строгом или умном режиме.