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