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

    1.索引是什么 索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构. 可以理解为“排好序的快速查找数据结构” 在数据之外,数据库系统还维护着满足特定查找算法的 ...

  2. vagrant up启动centos7时出现"rsync" could not be found on your PATH. Make sure that rsyncis properly ins

    (1)问题1:"rsync" could not be found on your PATH. Make sure that rsyncis properly ins 解决方法: ...

  3. Python3.5学习之旅——day5

    模块初识 一.定义 在python中,模块是用来实现某一特定功能的代码集合.其本质上就是以‘.py’结尾的python文件.例如某文件名为test.py,则模块名为test. 二.导入方法 我们在这一 ...

  4. python - 关于json和pickle两个序列化模块的区别

    传送门 https://stackoverflow.com/a/20980488/5955399 区别 json:用于字符串(unicode text)和python基本数据类型间进行转换.优点:跨语 ...

  5. urllib 库的代替品 requests 的用法

    Requuests 官方的介绍时多么的霸气,之所以那么霸气,是因为 Requestts 相比于 urllib 在使用方面上会让开发者感到更加的人性化.更加简洁.更加舒适,并且国外的一些公司也在使用re ...

  6. navicat连接数据库报错:未发现数据源名称并且未指定默认驱动程序

    解决方法:安装navicat自带sqlncli_x64.msi,在navicat安装目录下

  7. Android开发之显示分辨率及单位

    Android 各种屏幕分辨率: VGA:         Video Graphics Array,即:显示绘图矩阵,相当于640×480 像素: HVGA:       Half-size VGA ...

  8. swoole 消息队列

    <?php /** * 场景: * 监控订单表状态 队列通信 * 一个进程向队列发布消息 另外两个进程争抢 */ //设置主进程名 echo '主进程id:' . posix_getpid() ...

  9. 3_05_MSSQL课程_Ado.Net_DataSet数据集

    //创建一个内存的数据集 DataSet ds=new DataSet("LJK"); //创建一张内存表 DataTable dt01=new DataTable("d ...

  10. iOS 批量上传图片的 3 种方法

    AFNetworking 在去年年底升级到了 3.0.这个版本更新想必有很多好处,然而让我吃惊的是,它并没有 batch request 接口.之前的 1.x 版本.2.x 版本都实现了这个很常见的需 ...