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)
有人能告诉我这个的原因以及解决方案是什么.
提前致谢.
每当超过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
.
归档时间: |
|
查看次数: |
504 次 |
最近记录: |