Разбор двухзначных лет: установка даты поворота с помощью неизвестного шаблона даты

Пользователь вводит даты в разные шаблоны для моего приложения. В течение двухзначных лет он также должен определить дату опоры.


Пример:
pattern = yy-MM-dd
pivot date = 70 (Я добавляю текущее тысячелетие и прошлый век для более динамичной динамики программ => 1970 )

69-04-22 становится 2069-04-22
70-04-22 становится 1970-04-22


Как описано в этом ответе , легко построить DateTimeFormatter когда известен шаблон даты (здесь ddMMyy ).
Но поскольку пользователь вводит шаблон, я не уверен, как правильно построить DateTimeFormatterBuilder . Я не могу это сделать.

Должен ли я разобрать шаблон самостоятельно и вызвать appendPattern() и appendValueReduced() в правильном порядке? Или есть встроенное решение?

Здесь Java-8-решение (скорее похоже на хак):

 String pattern = "MM/dd/yy 'US'"; // user-input String text = "10/04/69 US"; // user-input Locale locale = Locale.US; // user-input, too? int yy = pattern.indexOf("yy"); DateTimeFormatter dtf; if ( (yy != -1) // explanation: condition ensures exactly two letters y && ((yy + 2 >= pattern.length()) || pattern.charAt(yy + 2) != 'y') ) { DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder(); String part1 = pattern.substring(0, yy); if (!part1.isEmpty()) { builder.appendPattern(part1); } builder.appendValueReduced(ChronoField.YEAR, 2, 2, 1970); String part2 = pattern.substring(yy + 2); if (!part2.isEmpty()) { builder.appendPattern(part2); } dtf = builder.toFormatter(locale); } else { dtf = DateTimeFormatter.ofPattern(pattern, locale); } LocalDate ld = LocalDate.parse(text, dtf); System.out.println("user-date: " + ld); // 2069-10-04 

Существует только одна крошечная оговорка: если любой пользователь получает сумасшедшую идею, чтобы определить два раза отдельно «yy» в шаблоне, то предлагаемое решение не будет выполнено. Тогда правильное решение потребует какого-то повторения по шаблонам шаблонов, но я думаю, что это слишком много, поэтому я оставляю это здесь.

Просто для сравнения, используя мою внешнюю библиотеку Time4J позволяет следующее короткое решение, потому что в его синтаксическом анализаторе также есть концепция установки любых подходящих атрибутов формата:

 LocalDate ld = ChronoFormatter.ofDatePattern(pattern, PatternType.CLDR, locale) .with(Attributes.PIVOT_YEAR, 2070).parse(text).toTemporalAccessor();