本文主要是介绍Java8学习笔记:计算两个时间的间隔及相隔天数、秒数等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境
Java11
IDEA:2020.1
前言
如果大家用过Java7的时间,应该都知道,要计算startTime
和endTime
时间间隔是要写很多代码的;
Java8开始对时间类进行过重构优化,并且提供了很多工具类;
代码
ChronoUnit类
现在假设有如下代码:
// 常量
private static final int ONE = 1;
public static void main(String[] args) {// 当前时间减一个月,也就是2020-11-03 00:00:00OffsetDateTime startTime = OffsetDateTime.now().with(LocalTime.MIN).plusMonths(-ONE);// 当前时间:2020-12-03 23:59:59.999OffsetDateTime endTime = OffsetDateTime.now().with(LocalTime.MAX);System.out.println(ChronoUnit.DAYS.between(startTime, endTime));System.out.println(ChronoUnit.HOURS.between(startTime, endTime));System.out.println(ChronoUnit.MINUTES.between(startTime, endTime));System.out.println(ChronoUnit.SECONDS.between(startTime, endTime));System.out.println(ChronoUnit.HALF_DAYS.between(startTime, endTime));
}
运行结果如下:
30 // 天
743 // 时 30 * 24 = 720 + 23 = 743
44639 // 分
2678399 // 秒
61 // 这个是按半天来算的,30天 = 60 半天 23小时 算一个半天 所以60+1=61
重点注意:
比如:开始时间:2020-08-12
结束时间:2020-12-07
其实已经超过3个月,将近四个月。
但是ChronoUnit.MINUTES.between(startTime, endTime)
得到的结果是3
;
假设业务上,要求,开始时间和结束时间的跨度最多为3个月;
那么,很明显ChronoUnit.MINUTES.between(startTime, endTime)
这个方法只精确到月
,没有精确到天
。
解决思路:
startTime.plusMonth(3)
即:将开始时间加上三个月,然后再去和结束时间进行比较;
这样就可以精确到天
了。
Duration类
该方法也提供了类似功能:
public static void main(String[] args) {// 当前时间减一个月,也就是2020-11-03 00:00:00OffsetDateTime startTime = OffsetDateTime.now().with(LocalTime.MIN).plusMonths(-ONE);// 当前时间:2020-12-03 23:59:59.999OffsetDateTime endTime = OffsetDateTime.now().with(LocalTime.MAX);System.out.println(Duration.between(startTime, endTime).toDays());System.out.println(Duration.between(startTime, endTime).toHours());System.out.println(Duration.between(startTime, endTime).toMinutes());// 这个我执行会报找不到符号:toSeconds()// System.out.println(Duration.between(startTime, endTime).toSeconds());// 该类不支持计算半天halfDay
}
结果:
30
743
44639
Period类
该提供的between()方法:
public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive) {return startDateInclusive.until(endDateExclusive);
}
也就是说它只支持LocalDate
类的计算。
public static void main(String[] args) {LocalDate today = LocalDate.now();System.out.println("Today : " + today);LocalDate birthDate = LocalDate.of(1993, Month.OCTOBER, 19);System.out.println("BirthDate : " + birthDate);Period p = Period.between(birthDate, today);System.out.printf("年龄 : %d 年 %d 月 %d 日", p.getYears(), p.getMonths(), p.getDays());
}
从上面可以看出,即使调用了between(...)
方法,也是需要根据返回 对象Period
,来获取相差的时间间隔。
总结
优先使用ChronoUnit
类,支持的非常全;
参考地址:
Java8中计算日期时间差
这篇关于Java8学习笔记:计算两个时间的间隔及相隔天数、秒数等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!