最近在工作中遇见一个小需求,要求计算两个日期之间相差几天,翻了翻API文档,发现没有直接可以用到的方法,因此通过梳理得到以下几中方法。

JavaApi文档中有:Date,Calendar,这些在之前的版本中就有,在JAVA8之后,引入java.time包,解决了原Date,Calendar存在的一些问题。

毫秒值计算:

通过两个日期相差的毫秒数计算,一天的毫秒数 24 * 60 * 60 * 1000。

 long now = new Date().getTime();
 long old = new SimpleDateFormat("yyyyMMdd").parse("20230101").getTime();
 long betweenDays = (now - old)/24/60/60/ 1000;
 System.out.println(betweenDays);

这样计算固然简单,但遇到一些精度要求高的就会出现精度问题。

Period类:

在Period类中,between用于计算两日期之间相差的天数,月数,年数。

public static Period between(LocalDate startDateInclusive,
                             LocalDate endDateExclusive)
获得一个Period ,包括两个日期之间的年数,月份和日期

 但我们想要的是获取两个日期之间的天数,因此使用这个方法的局限性就在于两个日期必须是同年同月。

        Period between = Period.between(LocalDate.of(2022, 6, 1),
                                             LocalDate.of(2023, 7, 30));
        System.out.println("years:"+between.getYears());
        System.out.println("months:"+between.getMonths());
        System.out.println("days:"+between.getDays());

但这个方法的好处是可以很明确的看到两个日期相差的年月日,缺点就是不能获取直接的天数。那么有没有之间计算两个日期相差天数的工具类?

ChronoUnit类:

ChronoUnit类中有个方法,可以直接计算两个日期相差的天数。

 LocalDate beginDate = LocalDate.of(2023, 1, 1);
 LocalDate nowDate = LocalDate.of(2023, 12, 31);
 long betweenDays = ChronoUnit.DAYS.between(beginDate, nowDate);
 System.out.println(betweenDays);

一般情况下我们用的是Date,要用上述方法需要将Date转为LocalDate。

 LocalDate localDate = 
            new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

 这样就可依靠JAVA原生的API计算两日期之间相差的天数,没有跨年跨月的限制。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐