Java Date类加减天数常遇到的问题

我们在是用Date.getTime()这个方法在进行加减时有时候会出现奇怪的结果。
比如这个例子:

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(date));
System.out.println(sdf.format(new Date(date.getTime()-60*60*1000*24*30)));

假设时间是2015-03-19 那么第二条语句是计算30天以前的那个日期,正常的输出的时间应该是 2015-02-17吧。
但是实际上输出的却是2015-04-08。

到底是什么原因呢?

仔细分析一下date.getTime()这个应该没有问题的。
那么问题肯定出现在60*60*1000*24*30这一句上了。

System.out.println(60*60*1000*24*30);

直接输出这一句的结果:-1702967296
居然是负值,原来是超出了int类型的范围了。

那么我们计算的时候应该怎么输出正确的内容呢?
其实很简单,只需要加一个字母。

System.out.println(60*60*1000*24*30L);

在计算毫秒值的时候指定数据类型为长整型即可。
所以正确的计算过程应该是这样的。

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(date));
System.out.println(sdf.format(new Date(date.getTime()-60*60*1000*24*30)));

通过Date类getTime()方法加减计算时间的时候一定要注意加减的毫秒值是否超出int类型的范围。


当然,还是不建议用这种方式来计算日期,Calendar类给我们提供了更好的解决方案,可以更加方便地实现日期的加减。

Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(cal.getTime()));

Calendar calSmall = Calendar.getInstance();
calSmall.setTime(cal.getTime());
calSmall.set(Calendar.DATE
            , calSmall.get(Calendar.DATE)-30);
System.out.println(sdf.format(calSmall.getTime()))

这段代码可以实现上面例子一样的效果,而且更加灵活。
除了日期的加减,还可以对年、月、时、分、秒字段进行加减。

比如我想计算的天数不是2015-03-19减去30天,而是上个月的这一天,即2015-02-19。要考虑闰年和大小月的问题,普通方法不是很好实现,但是通过Calendar类给我们提供的set方法就可以很简单的实现了。

cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)-1)

一行代码就够了,是不是很简单?

你可能感兴趣的:(j2se)