public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
String dateStr = "35/35/1985";
Date date = sdf.parse(dateStr);
我期待运行时异常,例如日期分析异常,但返回的日期对象是Sat Dec 05 00:00:00 IST 1987
到目前为止解析了35/35/1985
的逻辑字符串Sat Dec 05 00:00:00 IST 1987
?
更新: - 如果我设置setLenient(false)
,则会抛出异常。但如果我说的是真的
通过什么逻辑字符串35/35/1985
解析到目前为止Sat Dec 05 00:00:00 IST 1987
?
答案 0 :(得分:5)
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
String dateStr = "35/35/1985";
Date date = sdf.parse(dateStr);
回答你的“逻辑背后”问题:好吧,它将被解析为
xx.xx.1985
-> set / add 35 Months (xx.35.1982 -> xx.11.1987)
-> set / add 35 Days (35.11.1987 -> 05.12.1987)
如果您不想要此行为,请将lenient设置为false: http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#setLenient%28boolean%29
答案 1 :(得分:1)
为了跟踪时间,Java计算从1970年1月1日开始的毫秒数。这意味着,例如,1970年1月2日,开始时间为86,400,000毫秒。 (...)Java Date类将这些毫秒作为long值跟踪。因为long是带符号的数字,所以日期可以在1970年1月1日开始之前和之后表示。
基本上,Java的引擎不知道Date是什么,所以日期只不过是对自" Beginning"以来已经过了多少毫秒的引用。它将然后转换为漂亮的MM / DD / YYYY格式。在另一个方向也是如此。所以从技术上讲,35/35/1985不是一个错误,它只是意味着减去34个月,34天和1985年到0个月,0天和1970年"。
如果您计算贷款,这可能很有用,例如人们倾向于将5年作为" 60个月"。看点了吗?
答案 2 :(得分:0)
上面的代码
你提到了year => 1985
month=> 35
day =>35
现在首先,年份是1985年。如果月份是12,那么它将是1985年之后,当月份是24岁时将是1986年。超过24岁,年份将是1987年,而第35个月则是Nov 1987
。现在你的日期是35岁,超过30岁,所以它会增加一年,即1987年的December 5
。
所以最后Dec 5 1987
。