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

Wesley13
• 阅读 854

最近项目遇到一个需要计算两个日期间隔的期限,需要计算出,整年整月整日这样符合日常习惯的说法,利用之前的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时间类的用法。

如有错误,欢迎指正!

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
待兔 待兔
2年前
Java8 几个很好用的方法,真的很香
JDK8应该是Java中最坚挺一个版本,这个版本新增很多特性,让我们开发起来多了很多便利。不过最近Review项目代码的时候发现,虽然很多项目工程已经使用了JDK8,但是工程代码却很少使用到JDK8新特性、新方法。如果单从代码正确性上来说,老方式写法写当然没有什么问题,那唯一的缺点其实就是代码行数比较多,比较繁琐。那同样的需求,使
Karen110 Karen110
1年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
1年前
Java8 日期、时间操作
<divid"cnblogs\_post\_body"class"blogpostbody"<p一、简介</p<p  在Java8之前,日期时间API一直被开发者诟病,包括:java.util.Date是可变类型,SimpleDateFormat非线程安全等问题。故此,Java8引入了一套全新的日期时间处理API,新的API基于ISO标准
Wesley13 Wesley13
1年前
Java 8中处理日期和时间示例
在Java8以前,日期和时间处理一直被广大java程序员抱怨太难用,首先是java.util和java.sql中,都包含Date类,如果要处理java.text.DateFormat类处理。同时java.util.Date中既包含了日期,又包含了时间,所以java8新的日期和时间库,很好的解决了以前日期和时间类的很多弊端。并且也借鉴了第
Wesley13 Wesley13
1年前
oracle笔记之计算年龄、工龄和TRUNC
方法一:利用months\_between函数计算SELECTTRUNC(months\_between(sysdate,birthday)/12)ASagefromdual;方法二:日期转换为 'yyyyMMdd'格式后,相差一年的两个日期差为:10000,缺点是只能精确到年,并且不能四舍五入。selectTRUN
Wesley13 Wesley13
1年前
Java8中计算日期时间差
一.简述在Java8中,我们可以使用以下类来计算日期时间差异:1.Period2.Duration3.ChronoUnit二.Period类主要是Period类方法getYears(),getMonths()和getDays()来计算.示例:
Wesley13 Wesley13
1年前
Mysql 更新时间(加上或者减去一段时间)
Mysql时间加减函数为date\_add()、date\_sub()定义和用法DATE\_ADD()函数向日期添加指定的时间间隔。DATE\_SUB()函数向日期减少指定的时间间隔。语法DATE\_ADD(date,INTERVALexprtype)DATE\_SUB(date,INTERVALexprtype)da
Stella981 Stella981
1年前
LocalDateTime用法(jdk1.8 )
前言最近看别人项目源码,发现Java8新的日期时间API很方便强大,所以转载该入门介绍博客,记录一下。使用新时间日期API的必要性在java8以前,或许:当你在做有关时间日期的操作时,你会想到用Date;当你在做日期、月份、天数相加减时,你会想到用Calendar;当你需要对时间日期进行格式化时
Wesley13 Wesley13
1年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){