我需要检查表格中输入的日期是否有效。
我将日期分为年、日和月。而且我对检查 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
有点复杂,它有它的 setter、getter 和其他东西,但这些细节与这个问题无关。问题是关于方法的validaFecha
。
实施是否正确?有没有办法用标准库做到这一点?
根据您使用的 Java 版本,您可以访问一些已包含在 JDK 中的类,而无需外部库(其他 JAR 文件)。
从 Java 8 开始
如果您使用的是 Java 8,则可以使用类1来构造带有年、月和日的日期。即:
java.time.LocalDate
如果任何值(年、月、日)无效,该方法
LocalDate.of
将抛出java.time.DateTimeException
.从JDK1.1
java.util.Date
如果您使用的是 Java 6/7,则可以使用和2 个类来构造带有年、月和日的日期。即:java.util.Calendar
必须指定
calendar.setLenient(false);
只允许对应范围(年、月、日)内的值。如果这些值中的任何一个无效,它将Calendar
抛出java.lang.IllegalArgumentException
.──────────── 1. 您可以在Java SE 8 Date and Time
中看到一些此类和其他类的示例。2. 你可以在Java Date and Calendar examples 中看到一些例子。也在Java 日历类中。
不,根据您的代码,我会更改这部分:
由于闰年的规则是(强调我的):
这表示:
在您的代码中调整它的最简单方法是:
您遇到的另一个错误是在这部分:
这是方法的最后一行。应该
fecha.dia >=1
如果您想使用 JDK 类,除了 @PaulVargas 指示的选项外,您还可以使用
SimpleDateFormat
, 在任何 Java 版本中都可用(我记得从 1.5 开始)。这里的代码: