Period 和 Duration。两个类看表示时间量或两个日期之间的差,两者之间的差异为:Period基于日期值,而Duration基于时间值。
Instant
表示高精度时间戳,它可以和ZonedDateTime
以及long
互相转换。
Instant(内容很多,看完收获颇多)
参考:https://juejin.cn/post/6844904186702725127
Period
LocalDate startDate = LocalDate.of(2015, 2, 20);
LocalDate endDate = LocalDate.of(2017, 1, 15);
Period period = Period.between(startDate, endDate);
System.out.println(period.toTotalMonths());
System.out.println(period.getMonths());
System.out.println(period.getYears());
结果:
22
10
1
任何一个时间单元为负数,则isNegative()方法返回true,因此可以用于判断endDate是否大于startDate,如果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());
parse()方法,参数PnYnMnD,“P”代表时间格式,Y代表年,M代表月,D代表日
Period fromCharYears = Period.parse("P2Y");
assertEquals(2, fromCharYears.getYears());
Duration
下面是我看都的公司项目代码,业务是判断间隔是否大于一分钟
Instant createInstant = verifyCodeQu.getCreateTime().toInstant();
// CreateTime是Data类型
Instant nowInstant = Instant.now();
Duration between = Duration.between(createInstant, nowInstant);
我们能基于下面的方法获得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
duration.plusSeconds(60).getSeconds()
也可以使用plus()和minus()方法带TemporalUnit 类型参数进行加减
duration.plus(60, ChronoUnit.SECONDS).getSeconds()
Comments | NOTHING