有时候在进行日期计算的时候需要对日期进行加减,比如给定一个时间T,我们需要查找T到T+1的数据,最简单的方法就是转换成毫秒后加上一天对应的毫秒数,再转换回来,但是这样显得不够优雅,那么Java中有哪些方法可以实现这个功能呢?下面进行了总结:
方法一:基本方法
Date now = new Date();
Date date = new Date(now.getTime() + (1000 * 60 * 60 * 24));
看似正确的方法,其实里面是有坑的。
仔细阅读java.util.Date的注释,可以发现,对于一天的定义,根据Java虚拟机运行的环境,是有区别的。
主要在于两点:
1. 闰秒(leap second):每一两年有额外的一秒钟,加在6月30日或12月31日的最后一秒。
关于闰秒的知识可以参考陈皓:关于闰秒(leap second)的小知识
我写程序试了下,没有这个效果,不知道是不是时区的问题。
2. 夏令时(Daylight Savings Time,DST):一般在天亮早的夏季人为将时间提前一小时,各国的规则不一样。
关于夏令时的知识可以参考百度百科,关于夏令时的实验,可以查看Java中夏令时带来的Date不一致问题
好在现在中国已经不使用夏令时了,在这之后的时间操作都没有问题,不过万一哪天又开始启用了夏令时,用这种方法的程序很可能遇到各种诡异的问题。
方法二:使用java.util.Calendar
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DATE, 1);
Date date = calendar.getTime();
没什么问题,只不过要多写几行代码。
方法三:使用joda-time
LocalDateTime localDateTime = LocalDateTime.now();
localDateTime.plusDays(1);
非常的清晰优雅。
方法四:Java 8
Java 8也可以实现该功能,代码与joda-time一致,关于JDK 8中的LocalDateTime可以参见官方文档。