Java';s SimpleDateFormat make使用毫秒/微秒?

Java';s SimpleDateFormat make使用毫秒/微秒?,java,date,simpledateformat,milliseconds,Java,Date,Simpledateformat,Milliseconds,我有一个简单的测试 @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

我有一个简单的测试

@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)
...
junit.framework.AssertionFailedError:应为:但为:
位于junit.framework.Assert.fail(Assert.java:57)
位于junit.framework.Assert.failNotEquals(Assert.java:329)
位于junit.framework.Assert.assertEquals(Assert.java:78)
位于junit.framework.Assert.assertEquals(Assert.java:234)
位于junit.framework.Assert.assertEquals(Assert.java:241)
在main.TestDateFormatTest.test_MILLIS(TestDateFormatTest.java:36)
...
这意味着这一天从22天变成了29天。出了什么问题? 测试 平台:mac osx 10.9、ubuntu、win7
jdk:7,6

毫秒格式模式
S
不考虑数学位置值;它只将
586173000
视为添加到剩余日期的毫秒数。这个数字相当于大约6.784天,这就解释了为什么这个日期变成了29天而不是22天


解析前,在3位数字处截断毫秒,例如
“22-OCT-15 06.37.35.586”
,因此它被解释为586毫秒。

毫秒格式模式
s
不考虑数学位置值;它只将
586173000
视为添加到剩余日期的毫秒数。这个数字相当于大约6.784天,这就解释了为什么这个日期变成了29天而不是22天


在解析之前,请在3位数字处截断毫秒,例如,
“22-OCT-15 06.37.35.586”
,因此它被解释为586毫秒。

尝试4位数年份,看看是否仍然发生这种情况。也许是1915年的解析,而不是2015年的解析。“但在我加上微秒之后……”——你有9x
s
,这意味着纳秒。Micro或nano,它没有任何意义,因为
S
只定义了毫秒,所以使用3x
S
以外的任何东西都会产生奇怪的结果。你提到了微秒
SimpleDateFormat
不会解析4位数年份的微秒数据,并查看是否仍会发生这种情况。也许是1915年的解析,而不是2015年的解析。“但在我加上微秒之后……”——你有9x
s
,这意味着纳秒。Micro或nano,它没有任何意义,因为
S
只定义了毫秒,所以使用3x
S
以外的任何东西都会产生奇怪的结果。你提到了微秒
SimpleDataFormat
不解析微秒