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

如有错误,欢迎指正!

Java8 使用LocalDate计算两个日期间隔多少年,多少月,多少天的更多相关文章

  1. java7与java8中计算两个日期间隔多少年多少月多少天的实现方式

    最近工作中碰到个新需求,计算每个员工入职公司的时长,要求形式为多少年多少月多少天形式,某个值为0就跳过不显示,因为前段时间学习过java8新特性,对于这个需求,java8的新时间日期API可以直接解决 ...

  2. Oracle 计算两个日期间隔的天数、月数和年数

    在Oracle中计算两个日期间隔的天数.月数和年数: 一.天数: 在Oracle中,两个日期直接相减,便可以得到天数: select to_date('08/06/2015','mm/dd/yyyy' ...

  3. 【zc】 php计算两个日期相隔多少年,多少月,多少日的函数

    /* *function:计算两个日期相隔多少年,多少月,多少天 *数据接受格式: '2014-12-03','2000-12-01'; *param string $date1[格式如:2011-1 ...

  4. 在Oracle中计算两个日期间隔的天数、月数和年数

    一.天数: 在Oracle中,两个日期直接相减,便可以得到天数: select to_date('08/06/2015','mm/dd/yyyy')-to_date('07/01/2015','mm/ ...

  5. Java8 LocalDate计算两个日期的间隔天数

    Java8新增了java.time包,提供了很多新封装好的类,使我们可以摆脱原先使用java.util.Time以及java.util.Calendar带来的复杂. 其中LocalDate正是本文中使 ...

  6. SWIFT中计算两个日期间隔多少小时

    SWIFT中如何计算两个日期间隔多少个小时,其实几句代码就可以搞定了,Very Easy,在Playground内输入以下代码 var date1 = "2015-06-26 8:15:10 ...

  7. MySQL计算两个日期相差的天数、月数、年数

    MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数.分钟数.小时数.天数.周数.季度数.月数.年数,当前日期增加或者减少一天.一周等等. SELECT TIMESTAMPDIFF ...

  8. oracle中计算两个日期的相差天数、月数、年数、小时数、分钟数、秒数等

    oracle如何计算两个日期的相差天数.月数.年数.小时数.分钟数.秒数 1.相差天数(两个日期相减) --Oracle中两个日期相差天数-- select TO_NUMBER(TO_DATE('20 ...

  9. C语言计算两个日期间隔天数

    在网上看到了一个C语言计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙. 先直接代码吧 #include <stdio.h> #include <stdlib.h> in ...

随机推荐

  1. a链接内容过长,换行

    上图为溢出情况,此情况均为 英文或数字,但亲测,中文也可正常换行. 添加   word-wrap: break-word;  后,正常换行. 若不希望换行,设为  white-space: nowra ...

  2. 二分查找及几种变体的Python实现

    1. 在不重复的有序数组中,查找等于给定值的元素 循环法 def search(lst, target): n = len(lst) if n == 0: return -1 low = 0 high ...

  3. 解决Hibernate配置文件不在SRC文件夹下获取Session方法

  4. String_Java

    1.substring() 方法返回字符串的子字符串. 语法 public String substring(int beginIndex)//返回第beginIndex个字符以后的子字符串 或 pu ...

  5. windows下代码规范检测工具sonarqube安装与使用,含与maven的结合

    一.首先下载sonarqube   地址 : https://www.sonarqube.org/downloads/   (最新版本支持java11+,博主下载支持java8的版本7.7), 下载S ...

  6. Dam-list

    1. Dam 2. 溃坝 3. 水坝对环境的影响 4. 水坝列表 4.1 黄河干流水电站列表 4.2 长江干流水电站列表 4.3 长江水系支流 431. 大渡河 432. 乌江 433. 雅砻江 43 ...

  7. Java如何实现序列化,有什么意义?

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States, 但是Java给你提供一种应该 ...

  8. MyBatis6——一级缓存、二级缓存、逆向工程

    查询缓存 一级缓存:同一个sqlSession对象 MyBatis默认开启一级缓存,如果用同样的sqlSession对象查询相同的数据,则会在第一次查询时向数据库发送SQL语句,并将查询的结果放入到S ...

  9. Golang 如何交叉编译

    Golang 支持交叉编译,即在一个平台上生成另一个平台的可执行程序.方法如下: Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOOS=linux G ...

  10. Django线上部署代码修改失效问题

    记一次django项目的线上部署维护问题,django+nginx 关于nginx反向代理服务器的介绍这里有一篇博客介绍的比较好:nginx的相关介绍 以及当一次客户端请求发出后,uwsig以及uWS ...