一、引入
继续往下,我们来学习JDK8新增时间类的第四部分。
第四部分它是三个工具类,可以用来计算时间的间隔。
Duration
:它在计算时间的时候侧重于秒
跟纳秒
的计算Period
:在计算时间间隔的时候,只能算年、月、日
ChronoUnit
:它可以计算所有单位的间间隔
因此在学习的时候,我们只需要知道这三个各自的特点就行了
![image-20240424165433588](https://img-blog.csdnimg.cn/img_convert/9dea71bc561ee9b1c4b0015e926ce057.png)
二、Period
可以计算 年、月、日
之间的时间间隔,看下面代码
// 通过LocalDate.now()获取到当前本地的日历对象 年月日
LocalDate today = LocalDate.now();
System.out.println(today);
// 生日的 年月日
LocalDate birthDate = LocalDate.of(2000, 1, 1);
System.out.println(birthDate);
// 此时可以通过 between() 计算两个时间的间隔
// PS:在计算的时候是用第二个参数减第一个参数,因此birthDate应该放到第一个参数,today放到第二个参数
// 方法会返回一个 `period` 对象,这个就表示时间间隔对象
Period period = Period.between(birthDate, today);
System.out.println("相差的时间间隔对象:" + period); // 相差的时间间隔对象:P24Y3M23D(24年3月23天)
// 如果我们通过 get方法 去获取,就可以把上面的 24、3、23 获取出来
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
// 获取这个时间间隔中总共有多少个月
System.out.println(period.toTotalMonths()); // 291
三、Duration
它更加侧重于 秒
跟 纳秒
的计算,侧重点相对来讲比较精确一点。
// 使用LocalDateTime获取到当前时间的日历对象
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
// 再定义一个LocalDateTime用来指定出生的日历对象
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
System.out.println(birthDate);
// 利用 Duration 调用静态方法 between() 计算两个时间的间隔
// 在计算的时候跟刚刚一样,还是用第二个参数减第一个参数
// 方法会返回时间间隔对象 Duration
Duration duration = Duration.between(birthDate, today);
System.out.println("相差的时间间隔对象:" + duration); // 相差的时间间隔对象:PT213137H3M22.4781845S —— 这两个时间直接间隔 213137小时,3分钟,22.4781845秒
System.out.println("============================================");
// 下面我们可以将这个时间转换成整体的天数、小时、毫秒、纳秒,用的是 to 开头的方法
System.out.println(duration.toDays());// 两个时间差的天数
System.out.println(duration.toHours());// 两个时间差的小时数
System.out.println(duration.toMinutes());// 两个时间差的分钟数
System.out.println(duration.toMillis());// 两个时间差的毫秒数
System.out.println(duration.toNanos());// 两个时间差的纳秒数
四、ChronoUnit
第三个类是我们最为常用的,因为它能计算的单位非常的多,是最全面的一个,因此这个类是需要大家重点掌握的。
// 同样的,还是获取到当前时间的日历对象
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
// 生日的日历对象
LocalDateTime birthDate = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
System.out.println(birthDate);
// 再往下就可以计算两个时间的间隔了
// 用 ChronoUnit 去调用里面的属性 YEARS,调用 YEARS 就表示:我要计算两个时间之间相差多少年
// 在计算的时候跟刚刚一样,还是用第二个参数减第一个参数
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
// 如果调用 MONTHS,就表示两个时间之间相差多少月
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
// 调用 WEEKS,表示两个时间之前相差多少周
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));