2015-10-30 21 views
0

我有簡單的測試什麼是Java的SimpleDateFormat的使用毫/微秒?

@SuppressWarnings("deprecation") 
@Test 
public void test_NO_MILLIS() throws ParseException { 
    String rabbit = "22-OCT-15 06.37.35"; 
    final String PATTERN = "dd-MMM-yy HH.mm.ss"; 
    Date dateObject = new SimpleDateFormat(PATTERN).parse(rabbit); 
    Assert.assertNotNull(dateObject); 
    Assert.assertEquals(22, dateObject.getDate()); 
    Assert.assertEquals(10, dateObject.getMonth() + 1); 
    Assert.assertEquals(2015, dateObject.getYear() + 1900); 
    Assert.assertEquals(6, dateObject.getHours()); 
    Assert.assertEquals(37, dateObject.getMinutes()); 
    Assert.assertEquals(35, dateObject.getSeconds()); 
} 

而且一切順利。結果,我得到22天。

但是我加入微秒既模式和字符串值後面解析

@Test 
public void test_MILLIS() throws ParseException { 
    String rabbit = "22-OCT-15 06.37.35.586173000"; 
    final String PATTERN = "dd-MMM-yy HH.mm.ss.SSSSSSSSS"; 
    Date dateObject = new SimpleDateFormat(PATTERN).parse(rabbit); 
    Assert.assertNotNull(dateObject); 
    Assert.assertEquals(22, dateObject.getDate()); 
    Assert.assertEquals(10, dateObject.getMonth() + 1); 
    Assert.assertEquals(2015, dateObject.getYear() + 1900); 
    Assert.assertEquals(6, dateObject.getHours()); 
    Assert.assertEquals(37, dateObject.getMinutes()); 
    Assert.assertEquals(35, dateObject.getSeconds()); 
} 

我得到一個斷言失敗

junit.framework.AssertionFailedError: expected:<22> but was:<29> 
at junit.framework.Assert.fail(Assert.java:57) 
at junit.framework.Assert.failNotEquals(Assert.java:329) 
at junit.framework.Assert.assertEquals(Assert.java:78) 
at junit.framework.Assert.assertEquals(Assert.java:234) 
at junit.framework.Assert.assertEquals(Assert.java:241) 
at main.TestDateFormatTest.test_MILLIS(TestDateFormatTest.java:36) 
... 

這意味着這一天已成爲29,而不是22。出了什麼問題? 測試 平臺:Mac OSX上10.9,ubuntu的,Win7的 JDK:7,6

+0

嘗試了4位數一年,看看是否仍然發生。也許它解析爲1915年,而不是2015年 –

+2

「但之後我加入微秒......」 - 你9X'S',這使得納秒。微型或納米,它沒有任何意義,因爲'S'爲*毫秒*秒只定義了,所以用了3倍'S'其他任何會產生奇怪的結果。 – JimmyB

+3

你提到微秒。 'SimpleDateFormat'不解析微秒 –

回答

4

毫秒圖案S不考慮數學放置值的格式;它只是將586173000看作要添加到日期其餘部分的毫秒數。這個數字相當於約6.784天,這樣解釋了爲什麼日期成了29,而不是22

解析之前,切斷毫秒的3個數字,例如"22-OCT-15 06.37.35.586",所以它被解釋爲586毫秒。

相關問題