java DateFormat的问题

Sas*_*wat 3 java parsing date date-format simpledateformat

以下是我正在运行的一段代码.

@Test
public void testMyMehotd() {
    String expected = "2012-09-12T20:13:47.796327Z";
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'");
    //df.setTimeZone(TimeZone.getTimeZone("UTC"));
    Date d = null;
    try {
        d = df.parse(expected);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return;
    }

    String actual = df.format(d);

    System.out.println(expected);
    System.out.println(actual);

}
Run Code Online (Sandbox Code Playgroud)

但输出与我的预期不同.

expected : 2012-09-12T20:13:47.796327Z
actual   : 2012-09-12T20:27:03.000327Z
Run Code Online (Sandbox Code Playgroud)

有人能告诉我这个的原因以及解决方案是什么.

提前致谢.

Joã*_*lva 5

每当超过999毫秒时,DateFormat将尝试剩余的毫秒数添加到您的日期.请考虑以下更简单的示例:

 String expected = "2012-09-12T20:13:47.1001Z";
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSS'Z'");
 Date d = df.parse(expected);
Run Code Online (Sandbox Code Playgroud)

结果日期将是2012-09-12T20:13:48.0001.也就是说,因为你有1001毫秒,你得到1 额外的秒(1000毫秒)和1毫秒(1001 % 1000).因此47,与原始日期中的48秒数相比,您获得秒数.


如果您尝试解析一个月内无效天数的日期,也会发生这种情况.例如,如果您尝试将额外的一天添加到九月,并解析2012-09-31:

String expected = "2012-09-31";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date d = df.parse(expected);
System.out.println(df.format(d));
Run Code Online (Sandbox Code Playgroud)

你真的会得到2012-10-01.再次,这是因为DateFormat将检测,9月份的31天是不是有效的,并会尝试使用启发式变换Date,从而增加了有一天,与下个月的第一天结束了.

通过将宽松模式设置为false:可以选择告诉解析器不要使用这些启发式方法:

df.setLenient(false);
Run Code Online (Sandbox Code Playgroud)

但是,使用这种模式,上面两个例子都会抛出一个ParseException.