DateTimeFormatter class a parseBest() method parses string for its best match.
The following snippet of code specifies OffsetDateTime, LocalDateTime, and LocalDate as the preferred parsed result types:
String text = ... TemporalAccessor ta = formatter.parseBest(text, OffsetDateTime::from, LocalDateTime::from, LocalDate::from);
The method will try to parse the text as the specified types in order and return the first successful result.
A call to the parseBest() method is followed by if-else statement with an instanceof operator to check what type of object was returned.
The following code shows how to use the parseBest() method.
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAccessor; public class Main { public static void main(String[] args) { DateTimeFormatter parser = DateTimeFormatter .ofPattern("yyyy-MM-dd['T'HH:mm:ss[Z]]"); parseStr(parser, "2018-05-31"); parseStr(parser, "2018-05-31T16:30:12"); parseStr(parser, "2018-05-31T16:30:12-0500"); parseStr(parser, "2018-05-31 wrong"); }/* www .j a v a 2 s .c om*/ public static void parseStr(DateTimeFormatter formatter, String text) { try { TemporalAccessor ta = formatter.parseBest(text, OffsetDateTime::from, LocalDateTime::from, LocalDate::from); if (ta instanceof OffsetDateTime) { OffsetDateTime odt = OffsetDateTime.from(ta); System.out.println("OffsetDateTime: " + odt); } else if (ta instanceof LocalDateTime) { LocalDateTime ldt = LocalDateTime.from(ta); System.out.println("LocalDateTime: " + ldt); } else if (ta instanceof LocalDate) { LocalDate ld = LocalDate.from(ta); System.out.println("LocalDate: " + ld); } else { System.out.println("Parsing returned: " + ta); } } catch (DateTimeParseException e) { System.out.println(e.getMessage()); } } }