此代码:
package test;
import java.util.Date;
public class DateUnderflow {
public static void main(String[] args) {
Long timestamp = -8120649749785140250L;
System.out.println(new Date(timestamp));
}
}
产生以下输出:
"Sat Aug 03 10:00:59 CET 257325894"
为什么?没有例外的下溢?
Doc说,date
Date(long date)
参数是自纪元以来的毫秒数,所以我有点惊讶地发现自己远未来......
我的设置:
答案 0 :(得分:1)
RTFM(manual)
public Date(long date)
使用给定构造Date对象 毫秒时间值。如果给定的毫秒值包含时间 信息,驱动程序将时间组件设置为时间 默认时区(Java虚拟机的时区) 运行应用程序),对应于零GMT。
参数:
日期 - 自1970年1月1日00:00:00 GMT以来的毫秒数不超过 8099年的毫秒表示。负数 表示1970年1月1日00:00:00之前的毫秒数 GMT。
除此之外,我最有可能通过以下方式节省时间:如果你在java中处理时间,请使用joda时间库:
答案 1 :(得分:-1)
最大值为9223372036854775807
。如果超过此最大值,则下一个值将是最小最大值。
如果您使用此最大长值构建日期,则会产生日期。那旁边的约会怎么样?如果您从最小长值中为下一次启动添加更多mili-second。
-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);
这给出了你得到的结果。