java DateFormat的问题

时间:2012-09-12 21:13:20

标签: 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);

}

但输出与我的预期不同。

expected : 2012-09-12T20:13:47.796327Z
actual   : 2012-09-12T20:27:03.000327Z

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

提前致谢。

2 个答案:

答案 0 :(得分: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);

结果日期为2012-09-12T20:13:48.0001。也就是说,由于你有1001毫秒,你得到1 额外的秒(1000毫秒)和1毫秒({{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)); 。再次,那是因为2012-10-01将检测到9月31日不是有效,并将尝试使用启发式转换 DateFormat,因此增加了一天,最后是下个月的第一天。

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

false

但是,使用此模式,上述两个示例都会抛出df.setLenient(false);

答案 1 :(得分:2)

S表示毫秒,您通过了796327毫秒。该数字等于13 [min]:16 [sec]:327 [millis]所以额外的分钟和秒数添加到您的日期。