How to unify date format using DateTimeFormatter

前端 未结 4 974
盖世英雄少女心
盖世英雄少女心 2020-12-20 02:20

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)<
4条回答
  •  不知归路
    2020-12-20 03:00

    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.

提交回复
热议问题