java吧 关注:1,186,507贴子:12,592,246
  • 4回复贴,共1

发现了JDK1.6,1.7的一个不大不小的BUG

只看楼主收藏回复

不论什么语言的项目中都经常会用到日期和时间,然而java语言的日期时间却乱的一B,至于为什么这么乱,我不知道。
众所周知,java的日期是以GMT 1970-01-01 00:00:00:0000为基点的一个long值,在这个日期前的是负数,之后的是正数。
那么我们项目中经常用到的日期也是从1970以后的日期,正数的问题我没考证过,下面来说说1970年以前的负数。至于为什么我用到了负数,我觉得可能是脑抽吧,也许也和java的混乱的日期有关,因为你定义一个Date时,如果setYear、setMonth、setDate……时都是0(虽然现在这些方法都过时了,但肯定不止我一个人还用它),那么你会发现时间是1900-01-01 00:00:00,所以我个人对这个时间比较情有独钟,而我的项目中恰好用到了只需要时间的字段,所以我选定的日期就是1900年,值为:-2209017600000。
但是,当表达到1900-01-01 08:00:00 (-2208988800000)这个时间的时候,坑来了,你会发现java中是不存在这个时间的,无论你怎么定义 加减 解析你也得不到这个准确的时间点,他会变成1900-01-01 08:05:57.557,不信的话大家尽管尝试,能用的方法我都用了。跟踪JDK的源码,写的都是用时间long整除86400000再取余等操作,找不到bug的来源。有热心网友也尝试过,发现不同版本的jdk,这个时间点的精度是不一样的,但都不是整数,由此可以猜测是jdk在对long值计算是存在误差引起的问题,但并没有证实。
最后,Oracle的网站居然没有提交bug的地方,也是比较令人费解,所以发到这个贴吧来,希望受到人关注。如果有人能解决那就更好了。
第一次发帖,写的不好大家见谅。


IP属地:辽宁1楼2016-03-16 15:50回复
    关键字 JAVA DATE BUG


    IP属地:辽宁2楼2016-03-16 15:51
    回复
      赶紧发给Oracle公司~说不定奖励10万美元~


      IP属地:浙江来自Android客户端3楼2016-03-16 15:58
      收起回复