java date java-time 2-digit-year

java - Analizar cadena a fecha local no usa el siglo deseado



date java-time (1)

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

Año: el recuento de letras determina el ancho de campo mínimo por debajo del cual se utiliza el relleno. Si el recuento de letras es dos, se usa una forma reducida de dos dígitos. Para imprimir, esto genera los dos dígitos más a la derecha. Para el análisis, se analizará utilizando el valor base de 2000, lo que dará 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 SimpleDateFormat el rango -80 años hasta +20 años con respecto al actual.

Si desea configurarlo, debe usar appendValueReduced() . Esto está diseñado de manera inconveniente, pero posible, vea 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 desea años basados ​​en la semana, debe usar Y en lugar de y o el campo apropiado IsoFields.WEEK_BASED_YEAR . Con respecto al hecho de que no tiene ningún otro campo relacionado con la semana, asumiría el año calendario normal, no el semanal.

Estoy usando este DateTimeFormatter:

DateTimeFormatter.ofPattern("ddMMYY")

Quiero analizar la cadena 150790 y recibí 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