I need to parse different time format into BASIC_ISO_DATE. Right now, there are 4 types of date format:
2016-10-01 (ISO_LOCAL_DATE)<
Just to complement @Flown's answer (which works perfectly BTW), you can also use optional patterns (delimited by []):
DateTimeFormatter parser = new DateTimeFormatterBuilder()
// optional ISO8601 date/time and offset
.appendOptional(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
// optional yyyy-MM-dd or yyyyT or yyyyMMT
.appendPattern("[yyyy-MM-dd][yyyy'T'][yyyyMM'T']")
// default day is 1
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1L)
// default month is January
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1L)
// create formatter
.toFormatter();
This works exactly the same way. You can choose which one is clearer or easier to maintain. If there are lots of different patterns, using [] might end up being more confusing, IMO.
Note that I used ISO_OFFSET_DATE_TIME instead of ISO_ZONED_DATE_TIME. The only difference is that ISO_ZONED_DATE_TIME also accepts a timezone name in the end (like [Europe/London]), while ISO_OFFSET_DATE_TIME doesn't. Check the javadoc for more info.