Java 8 DateTimeFormatter解析具有不同重要性的可选小数秒

Java 8 DateTimeFormatter解析具有不同重要性的可选小数秒,java,java-time,datetime-parsing,Java,Java Time,Datetime Parsing,My(作为单元测试): 公共类MyDateTimeFormatterTest{ 私有静态最终字符串基\u PATTERN=“yyyy/MM/dd HH:MM:ss”; 专用静态最终DateTimeFormatter格式化程序= 模式的DateTimeFormatter.of(基本模式+“[.sssss]”); 私有静态最终LocalDateTime测试输入= LocalDateTime.of(2015,5,4,12,34,56,123456789); @数据提供者(name=“测试用例”) 公共

My(作为单元测试):

公共类MyDateTimeFormatterTest{
私有静态最终字符串基\u PATTERN=“yyyy/MM/dd HH:MM:ss”;
专用静态最终DateTimeFormatter格式化程序=
模式的DateTimeFormatter.of(基本模式+“[.sssss]”);
私有静态最终LocalDateTime测试输入=
LocalDateTime.of(2015,5,4,12,34,56,123456789);
@数据提供者(name=“测试用例”)
公共迭代器getTestCases(){
返回Arrays.asList(testFor(“,ChronoUnit.SECONDS),
测试(“.SSS”,ChronoUnit.MILLIS),
测试(“.ssss”,ChronoUnit.MICROS),
testFor(“.sss”,ChronoUnit.NANOS)).iterator();
}
@测试(dataProvider=“测试用例”)
public void testWithDefaultResolution(字符串输入、LocalDateTime输出){
assertThat(FORMATTER.parse(输入,LocalDateTime::from),equalTo(输出));
}
私有对象[]testFor(字符串模式后缀,TemporalUnit truncatedTo){
返回新对象[]{DateTimeFormatter.of模式(基本模式+模式后缀)
.format(TEST\u INPUT),TEST\u INPUT.truncatedTo(truncatedTo)};
}
}
我试图使用可选的具有不同重要性的小数秒来测试日期时间
字符串的解析。Javadoc的相关部分如下所示:

分数:以秒的分数输出纳秒场。第二个值的nano有九个数字,因此图案字母的计数从1到9。如果小于9,则第二个值的nano将被截断,只输出最有效的数字

基于我有限的理解,我使用了
[…]
将分数秒标记为可选,由于我对不同的重要性感兴趣,我认为我应该坚持
sssss

但是,单元测试在解析高达毫秒和微秒(即第二种和第三种情况)时失败。将
ResolverStyle
更改为在这里没有帮助,因为它在解析阶段失败,而不是解析阶段

我能知道我应该考虑哪些方法来解决我的问题?我应该选择指定每个小数位数(9次),还是有一种更智能的模式


编辑我终于找到了自己的答案。。。仍然将此问题保留一天,并查看是否有其他方法。

哦,很酷,另外15分钟的故障排除产生了以下结果:

private static final DateTimeFormatter FORMATTER = 
    new DateTimeFormatterBuilder().appendPattern(BASE_PATTERN) // .parseLenient()
        .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter();

编辑
parseLenient()
是。

您是否也看到了这个问题:?看起来你的答案基本上是正确的same@araqnid谢谢你指出。。。我已经在下面更新了自己的答案,删除了
parseLenient()
,以备将来参考。。。
private static final DateTimeFormatter FORMATTER = 
    new DateTimeFormatterBuilder().appendPattern(BASE_PATTERN) // .parseLenient()
        .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter();