本文我们学习java 8 中引入的两个与日期相关的新类:Period 和 Duration。两个类看表示时间量或两个日期之间的差,两者之间的差异为:Period基于日期值,而Duration基于时间值。
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类表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性。我们能使用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类,并通过实例介绍了其常用方法。