我在SimpleDateFormat和DateTimeFormatter中使用了相同的格式" Yyyymm"。我已经在两个格式化器中设定了宽大处理。
不过,SimpleDateFormat能够解析" 2019 02",而不是DateTimeFormatter。我尝试设置多个格式化器,但没有运气。
这一定是一种简单的方法,但我无法弄清楚它拥有。有人知道如何使用DateTimeFormatter恢复行为吗?
String dateString = "2018-11";
String format = "yyyyMM";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
simpleDateFormat.setLenient(true);
try {
Date parse = simpleDateFormat.parse(dateString);
System.out.println(parse);
System.out.println(format + ":parsed: true : java7");
} catch (ParseException e) {
System.out.println(format + ":parsed: false : java7");
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.LENIENT);
try {
TemporalAccessor parse = formatter.parse(dateString);
System.out.println(parse.toString());
System.out.println(format + ": parsed: true : java11");
} catch (Exception e) {
System.out.println(format + ":parsed: false : java11");
e.printStackTrace();
}
您可以使用DateTimeFormatterBuilder创建具有复杂模式的DateTimeFormatter:
例如,要解析yyyyMM
,yyyy-MM
和yyyy MM
您可以使用:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendValue(ChronoField.YEAR_OF_ERA, 4)
.optionalStart().appendLiteral('-').optionalEnd()
.optionalStart().appendLiteral(' ').optionalEnd()
.appendValue(ChronoField.MONTH_OF_YEAR, 2)
.toFormatter();
但是这种格式也很严格,因为一年和月份具有固定宽度,可选文字不起作用。
您可以添加.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
简单地解析局部日期。