Мне нужно проверить, что дата, введенная в форму, действительна.
У меня дата разделена на год, день и месяц. И я не заинтересован в проверке дат до 1900 года.
Я делаю это с помощью этого кода:
public class Fecha
{
int año;
int mes; // 1 a 12
int dia; // 1 a 31
}
static int[] diasMes= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/**
* Comprueba si la fecha es correcta. Se comprueban solo fechas de 1900
* o posteriores.
* @param fecha La fecha a comprobar.
* @return true si la fecha es correcta, false en otro caso.
* @throws IllegalArgumentException si el año es menor que 1900.
*/
boolean validaFecha( Fecha fecha)
{
if ( fecha.año < 1900 ) {
throw new IllegalArgumentException(
"Solo se comprueban fechas del año 1900 o posterior");
}
if ( fecha.mes<1 || fecha.mes>12 )
return false;
// Para febrero y bisiesto el limite es 29
if ( fecha.mes==2 && fecha.año%4==0 )
return fecha.dia>=1 && fecha.dia<=29;
return fecha.dia>=0 && fecha.dia<=diasMes[fecha.mes-1];
}
Класс, Fecha
который я использую, несколько сложнее, у него есть свой сеттер, геттер и другие вещи, но эти детали не имеют отношения к этому вопросу. Вопрос в методе validaFecha
.
Реализация правильная? Есть ли способ сделать это со стандартными библиотеками?
В зависимости от используемой версии Java у вас есть доступ к некоторым классам, уже включенным в JDK, без необходимости использования внешней библиотеки (дополнительных файлов JAR).
Начиная с Java 8
Если вы используете Java 8, вы можете использовать класс 1 для построения даты с указанием года, месяца и дня. А именно:
java.time.LocalDate
Если какое-либо из значений (год, месяц, день) недопустимо, метод
LocalDate.of
выдастjava.time.DateTimeException
.Из JDK1.1
Если вы используете Java 6/7, вы можете использовать классы
java.util.Date
и 2 для построения даты с указанием года, месяца и дня. А именно:java.util.Calendar
Необходимо указать
calendar.setLenient(false);
, чтобы разрешались только значения в соответствующих диапазонах (год, месяц, день). Если какое-либо из этих значений недопустимо, онCalendar
выдастjava.lang.IllegalArgumentException
.────────────
1. Вы можете увидеть некоторые примеры этого и других классов в Java SE 8 Date and Time .
2. Вы можете увидеть некоторые примеры в примерах даты и календаря Java . Также в Java Calendar Class .
Нет. Основываясь на вашем коде, я бы изменил эту часть:
Поскольку правило для високосных лет (выделено мной):
Это означает:
Самый простой способ адаптировать это в вашем коде:
Еще одна ошибка у вас есть в этой части:
Который находится в последней строке метода. Должно быть
fecha.dia >=1
Если вы хотите использовать классы JDK, в дополнение к параметрам, указанным @PaulVargas, вы можете использовать
SimpleDateFormat
доступные в любой версии Java (начиная с 1.5, насколько я помню). Вот код: