Java 8 DateTimeFormatter解析不同重要性的可选小数秒
我的MCVE(作为TestNG单元测试):
public class MyDateTimeFormatterTest { private static final String BASE_PATTERN = "yyyy/MM/dd HH:mm:ss";
private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern(BASE_PATTERN + "[.SSSSSSSSS]");
private static final LocalDateTime TEST_INPUT =
LocalDateTime.of(2015, 5, 4, 12, 34, 56, 123456789);
@DataProvider(name = "test-cases")
public Iterator<Object[]> getTestCases() {
return Arrays.asList(testFor("", ChronoUnit.SECONDS),
testFor(".SSS", ChronoUnit.MILLIS),
testFor(".SSSSSS", ChronoUnit.MICROS),
testFor(".SSSSSSSSS", ChronoUnit.NANOS)).iterator();
}
@Test(dataProvider = "test-cases")
public void testWithDefaultResolution(String input, LocalDateTime output) {
assertThat(FORMATTER.parse(input, LocalDateTime::from), equalTo(output));
}
private Object[] testFor(String patternSuffix, TemporalUnit truncatedTo) {
return new Object[] { DateTimeFormatter.ofPattern(BASE_PATTERN + patternSuffix)
.format(TEST_INPUT), TEST_INPUT.truncatedTo(truncatedTo) };
}
}
我想测试的日期时间解析String
与
使用DateTimeFormatter
。Javadoc的相关部分内容如下:
:以秒为单位输出毫微秒的字段。毫微秒的值具有9位数字,因此,图案字母的计数为1到9。如果小于9,则毫微秒的值将被截断,仅输出最高有效位。
基于我的有限理解,我曾经[...]
将小数秒标记为可选,并且由于我对各种意义都感兴趣,因此我认为我应该坚持SSSSSSSSS
。
但是,单元测试无法解析 到
毫秒和微秒,即第二种和第三种情况。将更ResolverStyle
改为LENIENT
此处无济于事,因为它在解析阶段失败,而不是解析失败。
我可以知道应该考虑采用哪种方法来解决我的问题吗?我应该使用DateTimeFormatterBuilder
可选地指定每个小数位数(9次),还是我的模式有“更智能”的方式?
我最终找到了自己的答案…仍然会在一天之内未解决该问题,并查看是否有其他方法。
回答:
太好了,再进行15分钟的故障排除会得出以下结果:
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder().appendPattern(BASE_PATTERN) // .parseLenient()
.appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter();
parseLenient()
是可选的。
以上是 Java 8 DateTimeFormatter解析不同重要性的可选小数秒 的全部内容, 来源链接: utcz.com/qa/427054.html