我MCVE(爲TestNG單元測試)的可選的小數秒:的Java 8 DateTimeFormatter解析了不同的意義
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的相關部分內容:
餾分:輸出納米的-第二場爲分數-的秒。納秒級數值有九位數字,因此模式字母的計數爲1到9.如果小於9,則納秒級數值將被截斷,只輸出最高有效位數。
根據我有限的瞭解,我以前[...]
到秒的小數部分標記爲可選的,因爲我有興趣在不同的意義,我想我應該堅持SSSSSSSSS
。
但是,單元測試在解析到毫秒和微秒(即第二和第三種情況)時失敗。將ResolverStyle
更改爲LENIENT
在這裏沒有幫助,因爲它在解析階段失敗,而不是解析。
我可否知道我應該考慮哪些方法來解決我的問題?我是否應該使用DateTimeFormatterBuilder
來選擇指定每個小數位(9次),還是使用我的模式有一個「更智能」的方式?
編輯我最終找到了我自己的答案...仍然將此留作未解答的一天,看看是否有其他方法。
你還看到這個問題:http://stackoverflow.com/questions/30103167/jsr-310-parsing-seconds-fraction-with-variable-length?看起來你的答案基本上是一樣的 – araqnid
@araqnid謝謝你指出了......我已經更新了我自己的答案,下面也刪除'parseLenient()',以備將來參考...... –