获得指定时间的下一天的N种方法

有时候在进行日期计算的时候需要对日期进行加减,比如给定一个时间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可以参见官方文档


参考:How to add one day to a date?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值