h.j*_*.k. 19 java datetime-parsing java-time
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) };
}
}
Run Code Online (Sandbox Code Playgroud)
我想测试的日期时间解析String与不同意义的可选的小数秒使用DateTimeFormatter.Javadoc的相关部分是:
分数:以秒为单位输出纳秒级字段.纳秒值具有九位数,因此模式字母的数量从1到9.如果小于9,则截断纳秒值,仅输出最高有效数字.
基于我有限的理解,我曾经[...]将小数秒标记为可选,因为我对不同的意义感兴趣,我认为我应该坚持SSSSSSSSS.
但是,单元测试在解析高达毫秒和微秒(即第二和第三种情况)时失败.更改ResolverStyleto LENIENT对此没有帮助,因为它在解析阶段失败,而不是解决方案.
我可以知道应该考虑哪些方法来解决我的问题吗?我应该使用DateTimeFormatterBuilder可选择指定每个小数位(9次),还是我的模式有一种"更聪明"的方式?
编辑我最终找到了自己的答案...仍然会留下一天没有答案,看看是否还有其他办法.
h.j*_*.k. 30
哦,很酷,另外15分钟的故障排除产生了这个:
private static final DateTimeFormatter FORMATTER =
new DateTimeFormatterBuilder().appendPattern(BASE_PATTERN) // .parseLenient()
.appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter();
Run Code Online (Sandbox Code Playgroud)
编辑 parseLenient()是可选的.
| 归档时间: |
|
| 查看次数: |
13658 次 |
| 最近记录: |