java8中引入了两个与日期相关的新类
- Period - 计算两个“日期”间隔的类
- Duration - 计算两个“时间”间隔的类
Period 类与 Duration 类都是一段持续时间的概念,如果需要对比时间,它们就需要一个固定的时间值,所以就需要 LocalDate 类与 Instant 、LocalTime、LocalDateTime类来配合它们使用:
- Period 对应使用 LocalDate ,它们的作用范围域都是日期(年/月/日)
- Duration 对应使用 Instant、LocalTime、LocalDateTime日期间隔,它们的作用范围域都是时间(天/时/分/秒/毫秒/纳秒)
Duration 表示一个时间段,Duration 包含两部分:seconds 表示秒,nanos 表示纳秒,它们的组合表达了时间长度。
因为 Duration 表示时间段,所以 Duration 类中不包含 now() 静态方法。注意,Duration 不包含毫秒这个属性。
Duration只能处理两个时间类,例如LocalTime, LocalDateTime, ZonedDateTime; 如果传入的是LocalDate,将会抛出异常
Duration默认输出格式为PTnHnMnS,如PT8H6M12.345S
以PT前缀开头,H:小时 M:分钟 S:秒
当Duration为0时,默认为:PT0S
使用示例:
执行结果:
方法一:
通过Duration计算两个LocalTime相差的时间
方法二:
ChronoUnit也可以计算两个单元之间的差值。
我们使用ChronoUnit类的between() 方法来执行相同的操作
方法三:
通过LocalTime类的toSecondOfDay()方法,返回时间对应的秒数,然后计算出两个时间相差的间隔
计算两个时间戳的间隔
项目中经常会有时间戳的值,下面的示例一起看一下如何比较时间戳。
Period 在概念上和 Duration 类似,区别在于 Period 是以年月日来衡量一个时间段。Duration 用于计算两个时间间隔,Period 用于计算两个日期间隔,所以 between() 方法只能接收 LocalDate 类型的参数。
说明:
Period可以用于计算两个“日期”之间的间隔,但是得到的是年月日,如两个日期相差1年2月3天,但是没办法知道1年2月3天具体是多少天,下面有讲通过调用ChronoUnit.between()方法计算两个单元相差的天数、月数、年数…
Period默认输出格式为PnYnMnD,如P2021Y12M3D
以P前缀开头,Y:年 M:月份 D:天
当Period为0时,默认为:P0D
注意
- getYears()、getMonths()、getDays()只能输出Period中的年月日。像如下的示例,想知道两个日期相差多少天需要用ChronoUnit.between()方法。
方法一:
ChronoUnit也可以计算两个单元之间的天数、月数或年数。
我们使用ChronoUnit类的between() 方法来执行相同的操作:
方法二:
调用LocalDate类的toEpochDay方法,返回距离 日期间隔1970年1月1日的long值
此方法只能计算两个LocalDate日期间的天数,不能计算月份、年数
