Без полной спецификации трудно дать точную рекомендацию. Методы, обычно используемые для переменных форматов, включают:
- Попробуем несколько известных форматов по очереди.
- Необязательные части в шаблоне формата.
DateTimeFormatterBuilder.parseDefaulting()
для частей, которые могут отсутствовать в проанализированной строке.
- Как вы знаете,
parseBest
.
Я предполагаю, что y-M-d всегда идут в таком порядке (никогда не M-d-y или d-M-y, например). 19-3-12
противоречит стандарту ISO 8601, поскольку стандарт требует (как минимум) четырехзначного года и двухзначного месяца. Задача с двузначным годом - угадать столетие: это 1919 или 2019 год или 2119?
Хорошая новость: наличие и отсутствие секунд и различное количество дробных цифр являются встроенными и не создают проблем.
Из того, что вы сказали нам, мне кажется, что следующее - это честный выстрел.
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("[uuuu][uu]-M-d")
.optionalStart()
.appendLiteral('T')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.optionalEnd()
.toFormatter();
TemporalAccessor dt = formatter.parseBest("19-3-12", LocalDateTime::from, LocalDate::from);
System.out.println(dt.getClass());
System.out.println(dt);
Выход:
class java.time.LocalDate
2019-03-12
Я полагаю, что он должен работать с вариантами форматов, которые вы описываете. Давайте просто попробуем другой пример:
dt = formatter.parseBest( "2019-03-12T13:12:45.1234", LocalDateTime::from, LocalDate::from);
System.out.println(dt.getClass());
System.out.println(dt);
class java.time.LocalDateTime
2019-03-12T13:12:45.123400
Для контроля интерпретации двухзначного года вы можете использовать один из перегруженных вариантов DateTimeFormatterBuilder.appendValueReduced()
. Я рекомендую вам рассмотреть проверку диапазона сверху.