通过使用java.util.Date可能出现下溢错误

kid*_*ose 7 java java.util.date

这段代码:

package test;

import java.util.Date;

public class DateUnderflow {

    public static void main(String[] args) {
        Long timestamp = -8120649749785140250L;
        System.out.println(new Date(timestamp));
    }
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

"Sat Aug 03 10:00:59 CET 257325894"
Run Code Online (Sandbox Code Playgroud)

怎么会?没有例外的下溢?

Doc说,date参数Date(long date)是自纪元以来的毫秒数,所以我有点惊讶地发现自己远未来......

我的设置:

  • Linux薄荷17.1
  • Eclipse Luna服务版本1a(4.4.1)
  • java7-OpenJDK的,AMD64

Kar*_*tic -2

最大长值为9223372036854775807。如果超过此最大值,下一个值将是最小最大值。

如果您根据此最大长值构建日期,这将生成一个日期。旁边的约会怎么样?如果您从最小长值开始添加更多毫秒。

-8120649749785140250相当于9223372036854775807 + 1102722287069635559

尝试System.out.println(9223372036854775807L+1102722287069635559L);

我相信你的代码相当于

Date d1 = new Date(9223372036854775807L); // Date for max long value
Date d2 = new Date(d1.getTime() + 1102722287069635559L); // plus some mili-seconds
System.out.println(d2);
Run Code Online (Sandbox Code Playgroud)

这给出了您得到的结果。