Я пытаюсь проанализировать строку, содержащую дату в неизвестном формате, и способ, который я выбираю (не самый лучший), - это попробовать все возможные форматы до правильного анализа. Для этого я использую библиотеку Vavr, и до сих пор я создал что-то вроде этого:
// My unknown date
String date = "2020-11-12T15:15:15.345";
// Date format that works for my unknown date (just for testing)
DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS]")
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
.toFormatter();
OffsetDateTime value = OffsetDateTime.parse(date, FORMATTER); // PARSE CORRECTLY
// Try all possible formats until one works
Try<OffsetDateTime> myParsedDate = Try.of(()->date)
.map(x->OffsetDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd")))
.onFailure(x->System.out.println("NO yyyy-MM-dd"))
.map(x->OffsetDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS+HH:mm")))
.onFailure(x->System.out.println("NO yyyy-MM-dd'T'HH:mm:ss.SSS+HH:mm"))
.map(x->OffsetDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS+HH:mm")))
.onFailure(x->System.out.println("NO yyyy-MM-dd'T'HH:mm:ss.SSS+HH:mm"))
.map(x->OffsetDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")))
.onFailure(x->System.out.println("NO yyyy-MM-dd'T'HH:mm:ss.SSS"))
.map(x->OffsetDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")))
.onFailure(x->System.out.println("NO yyyy-MM-dd'T'HH:mm:ss.SSSZ"))
.map(x->OffsetDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")))
.onFailure(x->System.out.println("NO yyyy-MM-dd'T'HH:mm:ss"))
.map(x->OffsetDateTime.parse(date, FORMATTER)) // DOSENT WORK
.onFailure(x->System.out.println("NO yyyy-MM-dd'T'HH:mm:ss[.SSS]"));
if(myParsedDate.isSuccess()) {
System.out.println("OK");
}else {
System.out.println("KO");
}
Выход:
NO yyyy-MM-dd
NO yyyy-MM-dd'T'HH:mm:ss.SSS+HH:mm
NO yyyy-MM-dd'T'HH:mm:ss.SSS+HH:mm
NO yyyy-MM-dd'T'HH:mm:ss.SSS
NO yyyy-MM-dd'T'HH:mm:ss.SSSZ
NO yyyy-MM-dd'T'HH:mm:ss
NO yyyy-MM-dd'T'HH:mm:ss[.SSS]
Вопрос в том, как объединить множество попыток/поймать или, в этом случае, используя VAVR, множество действий, чтобы при сбое одного действия попробовать следующее и так далее? Спасибо