看见一个java的bug[转帖]

hitzsf 2011-07-25 01:05:50
Java Date 的小BUG问题2011-07-25 13:02:37| 分类: java | 标签: |字号大中小 订阅 .

首先声明 ,这个bug不是我发现的,是百度知道alexnich 发现的,他提问的帖子的地址是http://zhidao.baidu.com/question/297274433.html



alexnich 在帖子中提到一段代码 如下:

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld3);
System.out.println(ld4);
======================

结果发现

ld3 = -1325491905

ld4 =-1325491552

两者相差了353秒,也就是相差了5分多钟

=========我敢肯定这是Date类的getTime()方法出了问题

于是我想到用这两个毫秒数分别构造两个Date 看看

long ld3 = -1325491905000L;
long ld4 = -1325491552000L ;

System.out.println("ld3= "+ld3);
System.out.println("ld4= "+ld4);

Date ld3D = new Date(ld3);
Date ld4D = new Date(ld4);

System.out.println(ld3D);
System.out.println(ld4D);

===========================

让我们看看结果吧,很是惊奇,两者明明相差5分钟的的数据,居然日期是一摸一样的。。。。。暴汗

ld3= -1325491905000
ld4= -1325491552000
Sat Dec 31 23:54:07 CST 1927

Sat Dec 31 23:54:08 CST 1927

摸不清头脑的我,鬼使神差觉得应该加上一个毫秒数试试,于是又看见了一个惊奇!

代码如下:

ld3 = -1325491905001L;
ld4 = -1325491552001L ;

System.out.println("ld3= "+ld3);
System.out.println("ld4= "+ld4);

ld3D = new Date(ld3);
ld4D = new Date(ld4);

System.out.println(ld3D);
System.out.println(ld4D);

==============================让我们再看看结果

ld3= -1325491905001
ld4= -1325491552001
Sat Dec 31 23:54:06 CST 1927
Sat Dec 31 23:59:59 CST 1927

--------------------------------------------------阿弥陀佛,看看发生了什么!!!!似乎这才是真的结果!

让我们庆祝发现一个bug的诞生吧,虽然不是我发现的,但是亲眼看到,也是件很荣幸的事情,嘎嘎。
...全文
206 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiachedan 2011-08-12
  • 打赏
  • 举报
回复
做个记号,不错!
binjoo 2011-08-01
  • 打赏
  • 举报
回复
煎蛋上看到的。。
话说是1928年1月1日从上海时区换到了北京时区(虽然都是8,但是还是有些不同)。
半夜郎中 2011-07-25
  • 打赏
  • 举报
回复
顶上去
hitzsf 2011-07-25
  • 打赏
  • 举报
回复
String str4 = "1927-12-31 23:54:08";

我只发现这个日期有问题,其他日期一切正常,再说它只是返回 以1970 年 1 月 1 日 00:00:00 GMT 为基准时间点的毫秒数,在基准时间之前 返回的是负数,可没有说日期必须限制在1970年1月1日后
qq_348070857 2011-07-25
  • 打赏
  • 举报
回复
这不是bug,getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
如果楼主把时间改成1970年之后就对了。
liuyuhua0066 2011-07-25
  • 打赏
  • 举报
回复
API上确实说的是针对1970 年 1 月 1 日以后的时间。
qybao 2011-07-25
  • 打赏
  • 举报
回复
厉害厉害,这都能发现,加了1毫秒,才能正确区别两个时间差5分钟,不加的时候不能区别,有时间再看看源码的具体实现了。
bolink5 2011-07-25
  • 打赏
  • 举报
回复
1927 这个数据是不是太老了啊
这个日期格式是针对1970 以后的日期
茫茫大海 2011-07-25
  • 打赏
  • 举报
回复
好像是我看错了。。。
茫茫大海 2011-07-25
  • 打赏
  • 举报
回复
getTime
public long getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

返回:
自 1970 年 1 月 1 日 00:00:00 GMT 以来此日期表示的毫秒数。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧