以下是我正在运行的一段代码。
@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
有人可以告诉我这个的原因以及解决方案是什么。
提前致谢。
答案 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]所以额外的分钟和秒数添加到您的日期。