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时间类的用法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。