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

时间:2015-05-07 02:03:23

标签: java java-time datetime-parsing

我的MCVE(作为TestNG单元测试):

.

我正在尝试使用DateTimeFormatter测试日期时间sed的解析,其中具有不同重要性的可选小数秒。 Javadoc的相关部分是:

  

分数:以秒为单位输出纳秒级字段。纳秒值具有九位数,因此模式字母的数量从1到9.如果小于9,则截断纳秒值,仅输出最高有效数字。

根据我的有限理解,我使用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

但是,单元测试在解析直到毫秒和微秒(即第二和第三种情况)时失败。将[...]更改为LENIENT对此无效,因为它在解析阶段失败,而不是解析。

我是否应该知道应该考虑哪些方法来解决我的问题?我应该使用DateTimeFormatterBuilder来选择性地指定每个小数位(9次),还是有更聪明的&#39;我的模式的方式?

编辑我最终找到了自己的答案......仍然会在一天之内将其留为未答复,并查看是否还有其他方法。

1 个答案:

答案 0 :(得分:28)

哦,很酷,另外15分钟的故障排除产生了这个:

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

修改 parseLenient()optional