java - from - ¿Por qué SimpleDateFormat(“MM/dd/aaaa”) analiza la fecha hasta el 20/10/20128?
string to date android (4)
20128 es un año válido y Java espera que el mundo viva tanto tiempo, supongo.
Si el número de letras de patrón es más de 2, el año se interpreta literalmente, independientemente del número de dígitos.
Si desea validar si una fecha está dentro del límite, puede definir una y marcar
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date maxDate = sdf.parse("01/01/2099"); // This is the limit
if(someDate.after(maxDate)){
System.out.println("Invalid date");
}
Tengo este codigo
DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
dateFormat.setLenient(false);
Date date = dateFormat.parse("10/20/20128");
y esperaría que la llamada dateFormat.parse arrojara la excepción ParseException, ya que el año que estoy proporcionando es de 5 caracteres en lugar de 4 como en el formato que definí. Pero por alguna razón, incluso con el indulgente establecido en falso, esta llamada devuelve un objeto Fecha del 20/10/20128.
¿Porqué es eso? No tiene mucho sentido para mí. ¿Hay otro ajuste para hacerlo aún más estricto?
Consulte java.text.SimpleDateFormat
API, letra de patrón y
: Para el análisis, si el número de letras de patrón es más de 2, el año se interpreta literalmente, independientemente del número de dígitos.
Usando SimpleDateFormat en java, puede lograr varios formatos legibles por humanos. Considere este fragmento de código:
Date curDate = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
String DateToStr = format.format(curDate);
System.out.println(DateToStr);
format = new SimpleDateFormat("dd-M-yyyy hh:mm:ss");
DateToStr = format.format(curDate);
System.out.println(DateToStr);
format = new SimpleDateFormat("dd MMMM yyyy zzzz", Locale.ENGLISH);
DateToStr = format.format(curDate);
System.out.println(DateToStr);
format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
DateToStr = format.format(curDate);
System.out.println(DateToStr);
Observa las diferentes salidas generadas por los distintos formatos:
2014/05/11
11-5-2014 11:11:51
11 de mayo de 2014, hora de verano de Europa del Este
Domingo, 11 de mayo de 2014 23:11:51 EEST
Siéntase libre de modificar la cadena de formato y puede obtener el resultado deseado.
Ver el javadoc
Año: si el calendario del formateador es el calendario gregoriano, se aplican las siguientes reglas.
- Para el formato, si el número de letras de patrón es 2, el año se trunca a 2 dígitos; De lo contrario se interpreta como un número.
- Para el análisis, si el número de letras de patrón es más de 2, el año se interpreta literalmente , independientemente del número de dígitos. Entonces, al usar el patrón "MM / dd / aaaa", "01/11/12" se analiza el 11 de enero de 12 AD
- Para analizar el patrón del año abreviado ("y" o "yy"), SimpleDateFormat debe interpretar el año abreviado en relación con algún siglo. Lo hace ajustando las fechas para que estén dentro de los 80 años anteriores y 20 años después de la creación de la instancia de SimpleDateFormat. Por ejemplo, usando un patrón de "MM / dd / aa" y un SimpleDateFormat
instancia creada el 1 de enero de 1997, la cadena "01/11/12" sería
interpretado como el 11 de enero de 2012, mientras que la cadena "05/04/64" sería
interpretado como el 4 de mayo de 1964. Durante el análisis, solo las cadenas
de exactamente dos dígitos, según lo definido por Character.isDigit (char), se analizará en el siglo predeterminado. Cualquier otra cadena numérica, como una
una cadena de un dígito, una cadena de tres o más dígitos o una cadena de dos dígitos que no son todos los dígitos (por ejemplo, "-1"), se interpreta literalmente.
Así que "01/02/3" o "01/02/003" se analizan, utilizando el mismo patrón, como
2 de enero, 3 d. Del mismo modo, "01/02 / -3" se analiza como 2 de enero, 4 aC.- De lo contrario, se aplican formularios específicos del sistema de calendario. Tanto para el formato como para el análisis, si el número de letras de patrón es 4 o
Más, se usa una forma larga específica del calendario. De lo contrario, un calendario
Se utiliza una forma abreviada o abreviada específica.
Por lo tanto, leerá todos los caracteres que vienen después del último año.