我们在是用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)
一行代码就够了,是不是很简单?