最近项目遇到一个需要计算两个日期间隔的期限,需要计算出,整年整月整日这样符合日常习惯的说法,利用之前的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. php 基础知识 常见面试题

    1.echo.print_r.print.var_dump之间的区别 * echo.print是php语句,var_dump和print_r是函数 * echo 输出一个或多个字符串,中间以逗号隔开, ...

  2. centos7.4安装gitlab

    1. 安装依赖软件 yum -y install policycoreutils openssh-server openssh-clients postfix 2.下载gitlab安装包,然后安装 c ...

  3. Unity热更新对比

    https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...

  4. ssh访问ubuntu13.10

    步骤: 首先确保网络连接是ok,网络连接方式"桥接“,手动配置 ip 192.168.1.9,和主机是同一网段 1.检查当前有没有安装openssh-server(已安装) 2. 安装ope ...

  5. Linux 修改 .bashrc

    bashrc是一个隐藏的文件,要打开并修改该文件需要: (1)命令:ls -a 找到文件 .bashrc: (2) 命令 vim ~/.bashrc 进入到文件: (3) 直接按 i 键可以对文件进行 ...

  6. shell脚本中执行shell脚本

    1.a.sh #!/bin/sh name="hello" ./b.sh $name  2.b.sh(这里把b.sh与a.sh放在同一目录下,便于演示) #!/bin/sh ech ...

  7. Python学习第十课——文件的基本操作

    文件基本操作 文件读操作 #读出路径下的测试.txt文件 f = open('测试.txt', encoding='utf-8') # 打开要读文件 data = f.read() # 读取内容 pr ...

  8. 【Python数据挖掘】第六篇--特征工程

    一.Standardization 方法一:StandardScaler from sklearn.preprocessing import StandardScaler sds = Standard ...

  9. TouchGFX

    TouchGFX让用户界面代码只占用10KB的 SRAM空间和20KB的闪存空间的C ++软件框架.有无操作系统均可

  10. [Android实例] Android网络收音机项目(内含源码)

    ======================帖子内容===================================最近喜欢听广播,但是搜索了一下,苦于网上没有Android的网络收音机项目的例 ...