3

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

@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

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

提前致谢。

4

2 回答 2

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毫秒(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. 同样,这是因为DateFormat将检测到 9 月 31 日无效,并将尝试使用启发式方法来转换Date从而添加一天,以下个月的第一天结束。

有一个选项可以告诉解析器不要使用这些启发式方法,方法是将宽松模式设置为false

df.setLenient(false);

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

于 2012-09-12T21:23:12.677 回答
2

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

于 2012-09-12T21:23:02.287 回答