tl; dr
Utilice el modo estricto en java.time.DateTimeFormatter
llegar a un análisis LocalDate
. Trampa para el DateTimeParseException
.
LocalDate.parse(
"31/02/2000" ,
DateTimeFormatter
.ofPattern ( "dd/MM/uuuu" )
.withResolverStyle ( ResolverStyle.STRICT )
)
Después de analizar, puede verificar el valor razonable. Por ejemplo, una fecha de nacimiento dentro de los últimos cien años.
birthDate.isAfter( LocalDate.now().minusYears( 100 ) )
Evite las clases de fecha y hora heredadas
Evite el uso de las problemáticas clases de fecha y hora que se incluyen con las primeras versiones de Java. Ahora reemplazado por las clases java.time .
LocalDate
& DateTimeFormatter
&ResolverStyle
La LocalDate
clase representa un valor de solo fecha sin hora del día y sin zona horaria.
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 );
}
La java.time.DateTimeFormatter
clase se puede configurar para analizar cadenas con cualquiera de los tres modos de indulgencia definidos en la ResolverStyle
enumeración. Insertamos una línea en el código anterior para probar cada uno de los modos.
f = f.withResolverStyle ( ResolverStyle.LENIENT );
Los resultados:
ResolverStyle.LENIENT
ld: 2000-03-02
ResolverStyle.SMART
ld: 2000-02-29
ResolverStyle.STRICT
ERROR: java.time.format.DateTimeParseException: No se pudo analizar el texto '31 / 02/2000 ': fecha no válida' 31 DE FEBRERO '
Podemos ver que en el ResolverStyle.LENIENT
modo, la fecha inválida se adelanta un número equivalente de días. En el ResolverStyle.SMART
modo (el predeterminado), se toma una decisión lógica para mantener la fecha dentro del mes y continuar con el último día posible del mes, el 29 de febrero en un año bisiesto, ya que no hay día 31 en ese mes. El ResolverStyle.STRICT
modo lanza una excepción quejándose de que no existe tal fecha.
Los tres son razonables según el problema y las políticas de su negocio. Parece que, en su caso, desea que el modo estricto rechace la fecha no válida en lugar de ajustarla.
Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como java.util.Date
, Calendar
, y SimpleDateFormat
.
Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan java.sql.*
clases.
¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
, y más .