JDK8时间处理API:Duration、Period和ChronoUnit

时间处理

问题来源:处理时间差值
  1. 需求:计算两个YearMonth之间相差月数
    String serialDate=n.getSerialDate();
	//获取日期字符串形如:202108
    oldDate = YearMonth.parse(serialDate, "yyyyMM");
    newDate = YearMonth.now();
    //返回两个日期间相差日期是否超过六个月
return (nowDate.getYear()-oldDate.getYear())*12+(nowDate.getMonthValue()-oldDate.getMonthValue())>6;
  1. 使用ChronoUnit
	String serialDate=n.getSerialDate();
	//获取日期字符串形如:202108
    oldDate = YearMonth.parse(serialDate, "yyyyMM");
    newDate = YearMonth.now();
    return ChronoUnit.MONTHS.between(oldMonth, nowMonth) > 6;
  • 扩展
  • Duration

主要用来衡量秒级和纳秒级的时间,使用于时间精度要求比较高的情况。
Duration是一个final class,并且它是可序列化和可比较的。实现了TemporalAmount接口
此接口定义了必须实现的四个方法
long get(TemporalUnit unit);
List getUnits();
//TemporalUnit代表的是时间对象的单位,比如:years, months, days, hours, minutes 和 seconds.
Temporal addTo(Temporal temporal);
Temporal subtractFrom(Temporal temporal);
//Temporal代表的是对时间对象的读写操作

我们可以用他对Instance,LocalTime进行计算

通过of 或between创建Duration对象

 Instant start = Instant.parse("2020-08-03T10:15:30.00Z");
 Instant end = Instant.parse("2020-08-03T10:16:30.12Z");
// LocalTime start2 = LocalTime.of(1, 20, 25, 1314);
//LocalTime end2 = LocalTime.of(3, 22, 27, 1516);
//Duration.between(start2, end2).getSeconds();
Duration duration = Duration.between(start, end);
        log.info("{}",duration.getSeconds());
        log.info("{}",duration.getNano());
        log.info("{}",duration.getUnits());
  • Period

    Period的单位是year, month 和day 。操作基本上和Duration是一致的。
    他是final Class,实现的ChronoPeriod是TemporalAmount的子接口

我们可以用他对LocalDate进行计算

        LocalDate startDate = LocalDate.of(2020, 2, 20);
        LocalDate endDate = LocalDate.of(2021, 1, 15);

        Period period = Period.between(startDate, endDate);
        log.info("{}",period.getDays());
        log.info("{}",period.getMonths());
        log.info("{}",period.getYears());
// long l = ChronoPeriod.between(startDate,endDate).get(ChronoUnit.MONTHS);
  • ChronoUnit

ChronoUnit是用来表示时间单位的,但是也提供了一些非常有用的between方法来计算两个时间的差值

        LocalDate startDate = LocalDate.of(2020, 2, 20);
        LocalDate endDate = LocalDate.of(2021, 1, 15);
        long years = ChronoUnit.YEARS.between(startDate, endDate);
        long months = ChronoUnit.MONTHS.between(startDate, endDate);
        long weeks = ChronoUnit.WEEKS.between(startDate, endDate);
        long days = ChronoUnit.DAYS.between(startDate, endDate);
        long hours = ChronoUnit.HOURS.between(startDate, endDate);
        long minutes = ChronoUnit.MINUTES.between(startDate, endDate);
        long seconds = ChronoUnit.SECONDS.between(startDate, endDate);
        long milis = ChronoUnit.MILLIS.between(startDate, endDate);
        long nano = ChronoUnit.NANOS.between(startDate, endDate);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值