介绍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类,并通过实例介绍了其常用方法。
--------------------- 
转自作者:neweastsun 
来源:CSDN 
原文:https://blog.csdn.net/neweastsun/article/details/88770592 

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的引用内容来看,这段代码计算的是使用`java.time.Duration`来计算`LocalDateTime`型的起始时间和结束时间之间的时间间隔。具体代码如下所示: ```java java.time.Duration duration = java.time.Duration.between(LocalDateTime.startTime, LocalDateTime.endTime); ``` 这段代码首先使用`Duration.between()`方法来计算起始时间和结束时间之间的时间差异,并将结果赋值给`duration`变量。注意,这里的`startTime`和`endTime`是占位符,应该替换为实际的`LocalDateTime`对象。 通过使用`Duration`的不同方法,你可以获取时间间隔的日、时、分、秒和毫秒等单位的值。例如,可以使用`toDays()`方法获取时间间隔的天数,使用`toHours()`方法获取小时数,使用`toMinutes()`方法获取分钟数,使用`getSeconds()`方法获取秒数,使用`toMillis()`方法获取毫秒数。 总结来说,以上代码用于计算指定的起始时间和结束时间之间的时间间隔,并且通过`Duration`提供的方法可以获取不同时间单位的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java8中计算时间的四种方式及区别PeriodDuration、ChronoUnit、Until](https://blog.csdn.net/weixin_42170100/article/details/124735058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值