Java DateTimeFormatter 无法格式化自己的解析 TemporalAccessor



我正在创建一个简单的DateTimeFormatter,但它似乎无法读取它自己的输出。我需要直接使用DateTimeFormatter而不是LocalDate的原因。格式或年月。格式是,代码需要足够通用,以处理具有完全不同字段的DateTimeFormatter的不同实例。下面的代码失败了:java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra

DateTimeFormatter yearMonthFormatter = DateTimeFormatter.ofPattern("yyyyMM");
TemporalAccessor yearMonthTemp = yearMonthFormatter.parse("200102");
String formatted = yearMonthFormatter.format(yearMonthTemp); //fails here trying to format its own output

有没有办法在不知道日期时间模式内容的情况下完成上述任务?即字符串" yyyym"不是静态的,它将作为参数传递。

编辑:当,在周六的40分钟内提出并解决。

这里发生的事情是,当您解析字符串时,会发生一个额外的解析阶段,并将表示"年份"的yyyy格式说明符转换为"年份"。将时间字段转换为"year";在返回的TemporalAccessor中,得到(yearMonthTemp.toString()):

{Year=2001, MonthOfYear=2},ISO

当你格式化时,yyyy格式说明符期望格式化一个"纪元年"。时间字段,但是时间访问器没有它,正如你在上面清楚地看到的。

如果需要在不知道时间的格式头的情况下更改时态的格式,例如从yyyyMM到mm -yyyy,则需要两个不同的DateTimeFormatters。就其解析的字段和生成的临时对象而言,格式化程序将完全兼容。

如果你想做的只是改变格式,你可以设置解析器的样式为STRICT(默认是SMART):

DateTimeFormatter.ofPattern("yyyyMM")
.withResolverStyle(ResolverStyle.STRICT);

虽然我找不到这方面的文档,但我发现这将阻止它自动更改"Year Of Era";Year"(通常表示为uuuu)。从我的测试,每个解析时间字段将出现在结果中。假设您在格式化DateFormatter中有相同的格式说明符,它将成功获得相同的时间字段。

注意,这也意味着您不能轻易地从这个DateTimeFormatter中得到类似YearMonth的东西,因为YearMonth.parse/YearMonth.from需要一个"year"。而不是"纪元">

// does not work
System.out.println(YearMonth.from(yearMonthTemp));

最新更新