ТЛ; др
Используйте строгий режим на java.time.DateTimeFormatter
для анализа LocalDate
. Ловушка для DateTimeParseException
.
LocalDate.parse( // Represent a date-only value, without time-of-day and without time zone.
"31/02/2000" , // Input string.
DateTimeFormatter // Define a formatting pattern to match your input string.
.ofPattern ( "dd/MM/uuuu" )
.withResolverStyle ( ResolverStyle.STRICT ) // Specify leniency in tolerating questionable inputs.
)
После синтаксического анализа вы можете проверить наличие разумного значения. Например, дата рождения в течение последних ста лет.
birthDate.isAfter( LocalDate.now().minusYears( 100 ) )
Избегайте устаревших классов даты и времени
Не используйте проблемные старые классы даты и времени, поставляемые с самыми ранними версиями Java. Теперь вытесняется классами java.time .
LocalDate
& DateTimeFormatter
& ResolverStyle
Класс LocalDate
представляет значение только для даты без времени суток и без часового пояса.
String input = "31/02/2000";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "dd/MM/uuuu" );
try {
LocalDate ld = LocalDate.parse ( input , f );
System.out.println ( "ld: " + ld );
} catch ( DateTimeParseException e ) {
System.out.println ( "ERROR: " + e );
}
Класс java.time.DateTimeFormatter
может быть настроен на анализ строк с любым из трех режимов снисхождения, определенных в перечислении ResolverStyle
. Мы вставляем строку в приведенный выше код, чтобы попробовать каждый из режимов.
f = f.withResolverStyle ( ResolverStyle.LENIENT );
Результаты:
ResolverStyle.LENIENT
ld: 2000-03-02
ResolverStyle.SMART
ld: 2000-02-29
ResolverStyle.STRICT
ОШИБКА: java.time.format.DateTimeParseException: текст '31/02/2000' не может быть проанализирован: неверная дата '31 ФЕВРАЛЯ'
Мы видим, что в режиме ResolverStyle.LENIENT
недействительная дата перемещается на эквивалентное количество дней вперед. В режиме ResolverStyle.SMART
(по умолчанию) принимается логическое решение сохранить дату в месяце и перейти к последнему возможному дню месяца, 29 февраля, в високосный год, поскольку нет 31-й день в этом месяце. Режим ResolverStyle.STRICT
вызывает исключение, сообщающее, что такой даты нет.
Все три из них являются разумными в зависимости от вашей бизнес-проблемы и политики. Похоже, в вашем случае вы хотите, чтобы строгий режим отклонял неверную дату, а не корректировал ее.
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и еще .