繁体   English   中英

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

[英]Possible underflow error through the usage of 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));
    }
}

产生以下输出:

"Sat Aug 03 10:00:59 CET 257325894"

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

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

我的设置:

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

RTFM( 手动

public Date(long date)

使用给定的毫秒时间值构造Date对象。 如果给定的毫秒值包含时间信息,则驱动程序将时间组件设置为默认时区(运行应用程序的Java虚拟机的时区)中与零GMT对应的时间。

参数:

date - 自1970年1月1日00:00:00 GMT以来的毫秒数,不超过8099年的毫秒表示。负数表示1970年1月1日00:00:00 GMT之前的毫秒数。

不要超过8099年的毫秒表示


除此之外,我最有可能通过以下方式节省时间:如果你在java中处理时间使用joda时间库:

http://www.joda.org/joda-time/

最大值为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);

这给出了你得到的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM