为什么字符串'35 / 35 / 1985`解析为'Sat Dec 05 00:00:00 IST 1987`日期对象?

时间:2016-02-04 12:25:38

标签: java date

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

3 个答案:

答案 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日开始之前和之后表示。

From JavaWorld.com

基本上,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