Java8 使用LocalDate计算两个日期间隔多少年,多少月,多少天

Wesley13
• 阅读 1011

最近项目遇到一个需要计算两个日期间隔的期限,需要计算出,整年整月整日这样符合日常习惯的说法,利用之前的Date和Calendar类会有点复杂,刚好项目使用了JDK8,那就利用起来这个新特性,上代码:

public static String getTerm(String startTime, String endTime) {
    String term = "";
    if (startTime.length() != 8 || endTime.length() != 8) {
        return startTime + "-" + endTime;
    }
    try {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        LocalDate startDate = LocalDate.parse(startTime, formatter);
        LocalDate endDate = LocalDate.parse(endTime, formatter);
        int start_month = startDate.getMonthValue();    //开始日期月份
        int start_day = startDate.getDayOfMonth();        //开始日期天数
        int end_year = endDate.getYear();                //结束日期年份
        int end_month = endDate.getMonthValue();        //结束日期月份
        int end_day = endDate.getDayOfMonth();            //结束日期天数

        long y = ChronoUnit.YEARS.between(startDate, endDate);        //计算两个日期间的年
        long m = ChronoUnit.MONTHS.between(startDate, endDate);        //计算两个日期间的月
        long d = ChronoUnit.DAYS.between(startDate, endDate);        //计算两个日期间的天

        int lastDayOfEndDate = endDate.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();//获取日期月份的最后一天
        if (start_day == end_day || lastDayOfEndDate == end_day) {
            m = end_month - start_month;
            d = 0;
        } else if (end_day > start_day) {
            d = endDate.getDayOfMonth() - startDate.getDayOfMonth();
        } else {
            String tmpY = "";
            String tmpM = "";
            String tmpD = "";
            if(end_month == 1) {
                tmpY = String.valueOf(end_year-1);
                tmpM = String.valueOf(12);
                tmpD = String.valueOf(start_day);
            }else {
                tmpY = String.valueOf(end_year);
                if (end_month < 10) {
                    tmpM = "0" + (end_month - 1);
                } else {
                    tmpM = String.valueOf(end_month - 1);
                }
                tmpD = String.valueOf(start_day);
            }
            String tmpTime = tmpY + tmpM + tmpD;
            LocalDate tmpDate = LocalDate.parse(tmpTime, formatter);
            d = ChronoUnit.DAYS.between(tmpDate, endDate);
        }
        if (m >= 12) {
            m = m - y * 12;
        }
        term = (y == 0 ? "" : y + "年") + (m == 0 ? "" : +m + "个月") + (d == 0 ? "" : d + "天");
    } catch (Exception e) {
        term = startTime + "-" + endTime;
        e.printStackTrace();
    }
    return term;
}

计算结果返回的内容:

开始时间:2019-11-30
结束时间:2020-04-30
时间间隔:5个月

开始时间:2019-11-30
结束时间:2020-04-20
时间间隔:4个月20天

开始时间:2019-11-30
结束时间:2020-11-30
时间间隔:1年

开始时间:2019-11-30
结束时间:2020-02-23
时间间隔:2个月24天

开始时间:2019-11-30
结束时间:2024-02-23
时间间隔:4年2个月24天

直接只用LocalDate API可能会出现不是预期的结果,比如开始结束日期分别为2019-01-31,2019-04-30时,直接用API计算月间隔为2,具体原因需要研究源码,这里就不深究了,不过很多新特性用起来还是方便的,有机会再深入研究一下Java8时间类的用法。

如有错误,欢迎指正!

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java8 时间类与Date类的相互转化
java8时间类与Date类的相互转化在转换中,我们需要注意,因为java8之前Date是包含日期和时间的,而LocalDate只包含日期,LocalTime只包含时间,所以与Date在互转中,势必会丢失日期或者时间,或者会使用起始时间。如果转LocalDateTime,那么就不存在信息误差。//Date与Instant的相互转化
待兔 待兔
3年前
Java8 几个很好用的方法,真的很香
JDK8应该是Java中最坚挺一个版本,这个版本新增很多特性,让我们开发起来多了很多便利。不过最近Review项目代码的时候发现,虽然很多项目工程已经使用了JDK8,但是工程代码却很少使用到JDK8新特性、新方法。如果单从代码正确性上来说,老方式写法写当然没有什么问题,那唯一的缺点其实就是代码行数比较多,比较繁琐。那同样的需求,使
Wesley13 Wesley13
2年前
java8的时间和`Date`的对比
java8的时间和Date的对比java8提供了新的时间接口。相对Date,Calendar,个人感觉最大的好处是对时间操作的学习成本很低,比Calendar低。1\.LocalDate,LocalTime,LocalDateTime
Wesley13 Wesley13
2年前
Java8 LocalDate计算两个日期的间隔天数
Java8新增了java.time包,提供了很多新封装好的类,使我们可以摆脱原先使用java.util.Time以及java.util.Calendar带来的复杂。其中LocalDate正是本文中使用的可以帮助计算两个日期的间隔天数的类。(其它常用的还有LocalTime,Clock,Instant等,本文不赘述)话不多说,上代码!L
Wesley13 Wesley13
2年前
MySQL计算日期的函数DATE_SUB(d,INTERVAL expr type)
MySQL计算日期的函数DATE\_SUB(d,INTERVALexprtype)DATE\_SUB(d,INTERVALexprtype)函数返回起始日期d减去一个时间段后的日期。expr是一个表达式,用来指定从起始日期添加或减去的时间间隔值。exp
Wesley13 Wesley13
2年前
Java日期时间API系列13
  从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date。下面是时间类互相转换大全,包含Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime和Dat
Wesley13 Wesley13
2年前
Java技巧——比较两个日期相差的天数
Java技巧——比较两个日期相差的天数摘要:本文主要记录了在Java里面如何判断两个日期相差的天数。判断两个Date类型的日期之间的天数通过计算毫秒数判断:1publicstaticvoidmain(Stringargs)throwsExc
Wesley13 Wesley13
2年前
Mysql 更新时间(加上或者减去一段时间)
Mysql时间加减函数为date\_add()、date\_sub()定义和用法DATE\_ADD()函数向日期添加指定的时间间隔。DATE\_SUB()函数向日期减少指定的时间间隔。语法DATE\_ADD(date,INTERVALexprtype)DATE\_SUB(date,INTERVALexprtype)da
Stella981 Stella981
2年前
LocalDateTime用法(jdk1.8 )
前言最近看别人项目源码,发现Java8新的日期时间API很方便强大,所以转载该入门介绍博客,记录一下。使用新时间日期API的必要性在java8以前,或许:当你在做有关时间日期的操作时,你会想到用Date;当你在做日期、月份、天数相加减时,你会想到用Calendar;当你需要对时间日期进行格式化时
京东云开发者 京东云开发者
9个月前
SimpleDateFormat 线程安全问题修复方案 | 京东物流技术团队
在日常的开发过程中,我们不可避免地会使用到JDK8之前的Date类,在格式化日期或解析日期时就需要用到SimpleDateFormat类,但由于该类并不是线程安全的,所以我们常发现对该类的不恰当使用会导致日期解析异常,从而影响线上服务可用率。