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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…