我需要将不同的时间格式解析为BASIC_ISO_DATE。目前,有4种日期格式:


2016-10-01(ISO_LOCAL_DATE)
2016T
201610T
2016-02-07T22:03:39.937Z(ISO 8601)


需要解析为20161001并打印出来,默认日期为01,默认月份为Jan。例子:


2016T-> 20160101
201610T-> 20161001


如何使用DateTimeFormatter实现此目的?

最佳答案

只是为了补充@Flown's answer(它可以很好地顺便说一句),您还可以使用可选模式(以[]分隔):

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();


这完全相同。您可以选择更清晰或更易于维护的一种。如果有很多不同的模式,使用[]可能会变得更加混乱,IMO。

请注意,我使用的是ISO_OFFSET_DATE_TIME而不是ISO_ZONED_DATE_TIME。唯一的区别是ISO_ZONED_DATE_TIME最后还接受时区名称(如[Europe/London]),而ISO_OFFSET_DATE_TIME则不接受。 Check the javadoc有关更多信息。

10-07 16:21
查看更多