环境

Java11
IDEA:2020.1

前言

如果大家用过Java7的时间,应该都知道,要计算startTimeendTime时间间隔是要写很多代码的;
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学习笔记:计算两个时间的间隔及相隔天数、秒数等相关推荐

  1. JS 计算两个时间的间隔

    js 计算两个时间之间间隔的天数 var start = new Date('2019-12-10'); //开始的时间 var end = new Date('2020-01-09'); //结束的 ...

  2. python的datetime举例_Python datetime库计算两个时间点之间的分钟(秒、天)数

    计算两个时间点之间的分钟数 import datetime def minNums(startTime, endTime): '''计算两个时间点之间的分钟数''' # 处理格式,加上秒位 start ...

  3. 计算两个时间的间隔时间是多少

    /*** 计算两个时间间隔* @param startTime 开始时间* @param endTime 结束时间* @param type 类型(1:相隔小时 2:)* @return*/publi ...

  4. JS 用时间戳计算两个时间之间间隔

    getTime()方法 方法定义: getTime() 方法可返回距 1970 年 1 月 1 日之间的毫秒数. 通常我们计算时间差都是通过获取两个时间数据,然后分别使用 getTime() 方法返回 ...

  5. 计算两个时间的间隔时长

    //方法一(直接处理时间) var time1='08:00'; var time2='16:00'; var hours;var time=time1+":"+time2; va ...

  6. 计算两个时间的间隔天数,除去双休日

    工作中,需要核算员工的工作饱和率,就需要计算出员工实际出勤小时数,和应出勤的小时数.关于应出勤自然要和工作日有关系,所以一周有效时间是5天,所以要除去所有的周六日.如下图: 以下方法便是除去周六日的方 ...

  7. LocalDateTime计算两个时间的间隔

    LocalDateTime date3 = LocalDateTime.now();LocalDateTime date4 = LocalDateTime.of(2022, 10, 8, 10, 30 ...

  8. 使用Java的Calendar类计算两段时间之间的工作日的天/小时/分钟/秒数

    计算两段时间之间的工作日的天/小时/分钟/秒数 我们能经常遇到一些需求,让获取工作日的时间(当然,调休也上班也是工作日哈!),之前自己给这搞得头大,所以整理总结,把该工具类记录下来,希望大家能用到的时 ...

  9. c语言计算时钟的夹角不用if,C语言学习笔记——计算时钟的夹角

    C语言学习笔记--计算时钟的夹角 题目内容: 钟面上的时针和分针之间的夹角总是在 0 -180之间 ( 包括 0 和180 ) .举例来说,在十二点的时候两针之间的夹角为 0 ,而在六点的时候夹角为1 ...

最新文章

  1. poj2718 Smallest Difference
  2. go 指针变量和普通变量的转化_7.8 C++指针变量的引用
  3. Spring注解开发-初始化/销毁方法注解
  4. 计算任何一天是星期几的几种算法
  5. 为什么0.1无法被二进制小数精确表示?
  6. Samba配置文件解析
  7. 关于某些系统统计查询等业务进行大数据量的测试
  8. 信安教程第二版-第26章大数据安全需求分析与安全保护工程
  9. linux open函数解释,linux之open函数解析
  10. 详解ifconfig命令
  11. 【IMX6ULL笔记】--内核底层驱动初步探究
  12. ie11安装程序无法继续 因为你的计算机,ie11无法安装解决方法详解
  13. 微博开放平台注册应用
  14. 大树体验云受邀参加CMO价值营销峰会 助力品牌新增长
  15. Win10下载和安装FPGA软件:Quartus Prime( Standard 版本18.1)
  16. 【程序员的爱情】彼岸花开谁又种下了执念
  17. “空天地海”一体化的海上应急通信网络技术综述
  18. 【路径规划】基于头脑风暴优化算法求解带时间窗和同时取送货的车辆路径问题附matlab代码
  19. python获取决策树的叶节点与深度
  20. win7桌面便笺:启动时提示windows7部分便笺的元数据已被损坏

热门文章

  1. jQuery循环遍历div,并且获取内容
  2. 计算机教师备好课的基本环节和方法,浅谈信息技术教师如何备好课
  3. Android自定义正负双向SeekBar
  4. 转载大神IOS开发系列【16】--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook
  5. 轻松自我介绍三步走——曼陀罗思考法
  6. 关于Aegisub的插件开发工作及个人看法
  7. 【ShaderToy】水彩画
  8. android图片获取加载小结
  9. 【tk实现学生管理系统】
  10. CentOS7中:通过 lrzsz 命令来上传和下载文件