2015-05-07 29 views
12

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次),還是使用我的模式有一個「更智能」的方式?

編輯我最終找到了我自己的答案...仍然將此留作未解答的一天,看看是否有其他方法。

+1

你還看到這個問題:http://stackoverflow.com/questions/30103167/jsr-310-parsing-seconds-fraction-with-variable-length?看起來你的答案基本上是一樣的 – araqnid

+0

@araqnid謝謝你指出了......我已經更新了我自己的答案,下面也刪除'parseLenient()',以備將來參考...... –

回答

18

那太酷了,故障的15分鐘取得這樣的:

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

編輯parseLenient()optional

相關問題