El análisis de cadena a la fecha local no usa el siglo deseado

Estoy usando este DateTimeFormatter:

DateTimeFormatter.ofPattern("ddMMYY") 

Quiero analizar la cadena 150790 y obtuve este error:

 Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=15, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2090},ISO of type java.time.format.Parsed 

Obviamente, quiero obtener el siguiente TemporalAccessor :

 {DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990} 

¿Sabes por qué obtuve el año 2090 en lugar de 1990?

Gracias por tu ayuda

Como esta pregunta es realmente sobre el nuevo java.time y NOT SimpleDateFormat , citaré la siguiente sección relevante :

Año: el recuento de letras determina el ancho mínimo del campo debajo del cual se usa el relleno. Si el recuento de letras es dos, se usa una forma reducida de dos dígitos. Para la impresión, esto produce los dos dígitos más a la derecha. Para el análisis sintáctico, esto se analizará utilizando el valor base de 2000, lo que da como resultado un año dentro del rango de 2000 a 2099 inclusive.

Vemos que Java-8 usa el rango 2000-2099 por defecto , no como el rango de SimpleDateFormat -80 años hasta +20 años en relación con el día de hoy.

Si desea configurarlo, debe usar appendValueReduced () . Esto está diseñado de una manera inconveniente, pero posible, mira aquí:

 String s = "150790"; // old code with base range 2000-2099 DateTimeFormatter dtf1 = new DateTimeFormatterBuilder().appendPattern("ddMMyy").toFormatter(); System.out.println(dtf1.parse(s)); // 2090-07-15 // improved code with base range 1935-2034 DateTimeFormatter dtf2 = new DateTimeFormatterBuilder().appendPattern("ddMM") .appendValueReduced( ChronoField.YEAR, 2, 2, Year.now().getValue() - 80 ).toFormatter(); System.out.println(dtf2.parse(s)); // 1990-07-15 

Por cierto, si realmente quieres años basados ​​en la semana, entonces debes usar Y en lugar de y o el campo apropiado IsoFields.WEEK_BASED_YEAR . En cuanto al hecho de que no tienes ningún otro campo relacionado con la semana, asumiría el año calendario normal, no el basado en la semana.

Intereting Posts