В Java коде --> из String с указанием года - двумя символами ==> в LocalDate()
Необходимо парсить дату, которая приходит в виде строчки, т.е. например:
String data = "15-JAN-85";
Date - устаревший класс, но он понимает какой век использовать, т.е.
Date dateD = new SimpleDateFormat("dd-MMM-yy").parse("15-JAN-85");
System.out.println("dataD = " + dateD);
выдаст ==> dataD = Tue Jan 15 00:00:00 MSK 1985
а
Date dateD2 = new SimpleDateFormat("dd-MMM-yy").parse("15-JAN-05");
System.out.println("dataD2 = " + dateD2);
==> dataD2 = Sat Jan 15 00:00:00 MSK 2005
LocalDate этого не понимает и
String strTime = "15-Jul-85";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MMM-yy");
LocalDate localDate = LocalDate.parse(strTime, formatter);
System.out.println(localDate);
==> 2085-07-15
я могу конечно парсить строчку и если последние две цифры > 22 менять на 19.. а если меньше, то ничего не менять
но тогда это перестанет работать в 2023 году
можно конечно и получать LocalDate.now() и сравнивать последние две цифры у этой даты и приходящие...
а есть может быть путь работать с LocalDate и указанием года - двумя цифрами без подобных сложностей?
Ответы (1 шт):
Как показано в ответе на английском SO, cледует воспользоваться классом DateTimeFormatterBuilder и его методами для обработки дат, чтобы создать требуемый экземпляр DateTimeFormatter:
appendValueReducedдля установки базового смещенияparseCaseInsensitiveдля обработки даты независимо от регистра (формат "MMM" обрабатывает названия месяцев в виде "Jan", "Feb")
public static LocalDate from(String s, int base) {
System.out.print(s + " with " + base + " -> ");
return LocalDate.parse(s, new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd-MMM-")
.appendValueReduced(ChronoField.YEAR, 2, 2, base)
.toFormatter()
);
}
String s = "15-JAN-1985";
System.out.println(from(s, 1900));
System.out.println(from(s, 1985));
System.out.println(from(s, 1990));
System.out.println(from(s, 2000));
Результаты:
15-JAN-85 with 1900 -> 1985-01-15
15-JAN-85 with 1985 -> 1985-01-15
15-JAN-85 with 1990 -> 2085-01-15
15-JAN-85 with 2000 -> 2085-01-15