我需要将不同的时间格式解析为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有关更多信息。