Java的一个小陷阱

在开发中碰到这样一个问题:计算出30天以前的时间,

开始用下面代码实现:

Date today = new Date();   

Timestamp todaytime = new Timestamp(today.getTime());   

Timestamp sometime = new Timestamp(todaytime.getTime() -  30 * (24 * 60 * 60 * 1000));

 System.out.println("today:" + todaytime);   

 System.out.println("sometime:" + sometime);

你一定想不到会输出下面的结果:

today : 2008-07-07 11:05:25.484

sometime : 2008-07-27 04:08:12.78

减去了毫秒数结果得到了一个未来的时间,开始以为是Timestamp内有问题,其实不然,看下面:

long t = 30 * (24 * 60 * 60 * 1000);

System.out.println(t);



输出:-1702967296
不可思议吧,居然是负数,再看下面:
long t = 30l * (24l * 60l * 60l * 1000l);

System.out.printf("t=%d,int max=%d",t,Integer.MAX_VALUE);



输出:

t=2592000000,int max=2147483647
 
原来运算结果超出了 int 的最大值,如果用 32 位存放数据就会溢出变成负数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值