Fork me on GitHub

int 类型过大变成负数

计算机存储系统使用补码标识,int 类型占 32 位,首位是符号位:0 表示正数,1 表示负数。正数补码与原码相同负数补码除符号位其余各位与原码取反,然后加 1

日常开发中常用的方法我们一般会抽取出公用的方法,想使用一个操作日期的工具类,本来想用 Apache 的 commons 包的 DateUtils 工具类,但是没有找到想要的方法,转而求其次使用之前同事封装的工具类,结果遇到一个问题。

需求:给定一个 Date 对象,找到特定天数后的日期时间

工具类代码如下:

1
2
3
4
public static Date datetimeAddDay(Date datetime, int day) {
datetime.setTime(datetime.getTime() + day * 24 * 60 * 60 * 1000);
return datetime;
}

猛的一看,并没有什么不对,结果运行时日期不对,写个测试类跑了一下,大吃一惊!!!
测试类代码:

1
2
3
4
5
6
7
@Test
public void testDatetimeAddDay() {
Date datetime = new Date();
System.out.println("当前时间:" + datetime);
Date datetimeAddDay = DateUtil.datetimeAddDay(datetime, 30);
System.out.println("30天后:" + datetimeAddDay);
}

运行结果:image

这时间还给我倒回去了,原来是工具类的方法加的毫秒数超过 int 类型最大值了 2的31次方-1,符号位成了 1,整体变为负数。所以工具类中运算的毫秒数使用 long 类型即可!

------本文结束------
0%