Skip to main content
 首页 » 编程设计

介绍java 的 Period 和 Duration 类

2022年07月19日123lonelyxmas

介绍java 8 的 Period 和 Duration 类

本文我们学习java 8 中引入的两个与日期相关的新类:Period 和 Duration。两个类看表示时间量或两个日期之间的差,两者之间的差异为:Period基于日期值,而Duration基于时间值。

Period 类

Period 类表示一段时间的年、月、日,开使用between()方法获取两个日期之间的差作为Period 对象返回:

LocalDate startDate = LocalDate.of(2015, 2, 20); 
LocalDate endDate = LocalDate.of(2017, 1, 15); 
  
Period period = Period.between(startDate, endDate); 

然后,我们或从Period对象中货位日期单元,使用getYears(),getMonhs(),getDays()方法:

LOG.info("Years:" + period.getYears() +  
  " months:" + period.getMonths() +  
  " days:"+period.getDays()); 

这种情况下,任何一个时间单元为负数,则isNegative()方法返回true,因此可以用于判断endDate是否大于startDate:

assertFalse(period.isNegative()); 

如果isNegative()返回false,那么startDate早于endDate。

另一个创建Period类型对象是基于年、月、日和周,通过下面方法:

Period fromUnits = Period.of(3, 10, 10); 
Period fromDays = Period.ofDays(50); 
Period fromMonths = Period.ofMonths(5); 
Period fromYears = Period.ofYears(10); 
Period fromWeeks = Period.ofWeeks(40); 
  
assertEquals(280, fromWeeks.getDays()); 

如果仅一个值表示,如使用ofDays()方法,那么其他值为0;当使用ofWeeks()方法时,则其参数值可以设置天数为参数乘以7。

我们也可以通过解析文本序列来创建Period,其格式为“PnYnMnD”:

Period fromCharYears = Period.parse("P2Y"); 
assertEquals(2, fromCharYears.getYears()); 
  
Period fromCharUnits = Period.parse("P2Y3M5D"); 
assertEquals(5, fromCharUnits.getDays()); 

period的值可以通过plusX()、minusX()方法进行增加或减少,其中X表示日期单元:

assertEquals(56, period.plusDays(50).getDays()); 
assertEquals(9, period.minusMonths(2).getMonths()); 

Duration 类

Duration类表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性。我们能使用between()方法比较两个瞬间的差:

Instant start = Instant.parse("2017-10-03T10:15:30.00Z"); 
Instant end = Instant.parse("2017-10-03T10:16:30.00Z"); 
          
Duration duration = Duration.between(start, end); 

那么我们能使用getSeconds() 或 getNanoseconds() 方法获取时间单元的值:

assertEquals(60, duration.getSeconds()); 

我们也可以通过LocalDateTime 类获取获取Duration对象:

LocalTime start = LocalTime.of(1, 20, 25, 1024); 
LocalTime end = LocalTime.of(3, 22, 27, 1544); 
  
Duration.between(start, end).getSeconds(); 

isNegative()方法能用于验证后面时间是否大于前面时间:

assertFalse(duration.isNegative()); 

我们能基于下面的方法获得Duration对象,ofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds():

Duration fromDays = Duration.ofDays(1); 
assertEquals(86400, fromDays.getSeconds()); 
         
Duration fromMinutes = Duration.ofMinutes(60); 

当然也可以通过文本序列创建Duration对象,格式为 “PnDTnHnMn.nS”:

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S"); 
Duration fromChar2 = Duration.parse("PT10M"); 
 

可以使用toDays(), toHours(), toMillis(), toMinutes()方法把Duration对象可以转成其他时间单元:

assertEquals(1, fromMinutes.toHours()); 

也可以通过 plusX()、minusX()方法增加或减少Duration对象,其中X表示days, hours, millis, minutes, nanos 或 seconds:

assertEquals(120, duration.plusSeconds(60).getSeconds());      
assertEquals(30, duration.minusSeconds(30).getSeconds()); 

也可以使用plus()和minus()方法带TemporalUnit 类型参数进行加减:

assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds());      
assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds()); 

总结

本文我们介绍了java 8 中Period 和 Duration类,并通过实例介绍了其常用方法。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/88770592
阅读延展