Почему это не сработало
java.time
не предоставляет значения по умолчанию для месяца и дня месяца, как это делает Joda-Time.В сообщении говорится, что он не может получить LocalDate
только за год или, наоборот, ему не хватает месяца и дня (вы можете указать собственные значения по умолчанию, как показано в ответ Михаила Холодкова ).Как правило, это поведение помогает нам: оно напоминает нам о необходимости ввода всех необходимых значений и дает понять из кода, используются ли какие-либо значения по умолчанию и какие.
Что делать вместо
Просто используйте Year
класс java.time
.Сначала объявите
public static final DateTimeFormatter TWO_YEAR_FORMATTER = new DateTimeFormatterBuilder()
.appendValueReduced(ChronoField.YEAR, 2, 2, 1950)
.toFormatter();
Затем используйте
int year = Year.parse("99", TWO_YEAR_FORMATTER).getValue();
System.out.println(year);
Выход
1999
Введите желаемое базовое значение, куда я положил1950 указать год в течение 99 лет (включительно) с этого года.Если вы хотите, чтобы год был в прошлом, включая этот, вы можете использовать:
private static final Year base = Year.now(ZoneId.of("Asia/Kolkata")).minusYears(99);
public static final DateTimeFormatter TWO_YEAR_FORMATTER = new DateTimeFormatterBuilder()
.appendValueReduced(ChronoField.YEAR, 2, 2, base.getValue())
.toFormatter();
Кстати, не верьте мне на слово, но я думаю, что Joda-Time использует текущий год минус 30 лет.в качестве базы или оси.Если это так, то использование 30 вместо 99 в последнем фрагменте будет наиболее совместимым (поэтому также даст вам ожидаемый 1999 год).