Java8使用LocalDate计算日期实例代码解析
最近项目遇到一个需要计算两个日期间隔的期限,需要计算出,整年整月整日这样符合日常习惯的说法,利用之前的Date和Calendar类会有点复杂,刚好项目使用了JDK8,那就利用起来这个新特性,上代码:
publicstaticStringgetTerm(StringstartTime,StringendTime){
Stringterm="";
if(startTime.length()!=8||endTime.length()!=8){
returnstartTime+"-"+endTime;
}
try{
DateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDatestartDate=LocalDate.parse(startTime,formatter);
LocalDateendDate=LocalDate.parse(endTime,formatter);
intstart_month=startDate.getMonthValue(); //开始日期月份
intstart_day=startDate.getDayOfMonth(); //开始日期天数
intend_year=endDate.getYear(); //结束日期年份
intend_month=endDate.getMonthValue(); //结束日期月份
intend_day=endDate.getDayOfMonth(); //结束日期天数
longy=ChronoUnit.YEARS.between(startDate,endDate); //计算两个日期间的年
longm=ChronoUnit.MONTHS.between(startDate,endDate); //计算两个日期间的月
longd=ChronoUnit.DAYS.between(startDate,endDate); //计算两个日期间的天
intlastDayOfEndDate=endDate.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();//获取日期月份的最后一天
if(start_day==end_day||lastDayOfEndDate==end_day){
m=end_month-start_month;
d=0;
}elseif(end_day>start_day){
d=endDate.getDayOfMonth()-startDate.getDayOfMonth();
}else{
StringtmpY="";
StringtmpM="";
StringtmpD="";
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);
}
StringtmpTime=tmpY+tmpM+tmpD;
LocalDatetmpDate=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(Exceptione){
term=startTime+"-"+endTime;
e.printStackTrace();
}
returnterm;
}
计算结果返回的内容:
开始时间: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天
直接只用LocalDateAPI可能会出现不是预期的结果,比如开始结束日期分别为2019-01-31,2019-04-30时,直接用API计算月间隔为2,具体原因需要研究源码,这里就不深究了,不过很多新特性用起来还是方便的,有机会再深入研究一下Java8时间类的用法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。