[Java] 计算两个日期之间的差(年 月 日)

在项目中有这样的需求:   需要显示剩余的年月日。如下表:

起始时间                截至期                     有效期 

              2011-01-01          2013-12-31            3年

2011-01-01          2011-01-01            1天

代码如下: 主要是参考 remainDateToString()方法

 
  1. /** 
  2.  * 处理平台的时间转换 
  3.  * @author alf 
  4.  * 2011-8-31 上午09:21:39 
  5.  */  
  6. public class DateHandler {  
  7.     private static Calendar calS=Calendar.getInstance();  
  8.     private static Pattern   p   =   Pattern.compile("\\d{4}-\\d{2}-\\d{2}");//定义整则表达式  
  9.     private DateHandler(){}  
  10.     /** 
  11.      * 计算剩余时间 
  12.      * @param startDateStr 
  13.      * @param endDateStr 
  14.      * @return 
  15.      */  
  16.     public static String remainDateToString(String startDateStr, String endDateStr){  
  17.         java.util.Date startDate = null;  
  18.         java.util.Date endDate= null;  
  19.         try {  
  20.             startDate = new SimpleDateFormat("yyyy-MM-dd").parse(startDateStr);  
  21.         } catch (ParseException e) {  
  22.             e.printStackTrace();  
  23.             return "";  
  24.         }  
  25.         try {  
  26.             endDate = new SimpleDateFormat("yyyy-MM-dd").parse(endDateStr);  
  27.         } catch (ParseException e) {  
  28.             e.printStackTrace();  
  29.             return "";  
  30.         }  
  31.         calS.setTime(startDate);  
  32.         int startY = calS.get(Calendar.YEAR);  
  33.         int startM = calS.get(Calendar.MONTH);  
  34.         int startD = calS.get(Calendar.DATE);  
  35.         int startDayOfMonth = calS.getActualMaximum(Calendar.DAY_OF_MONTH);  
  36.           
  37.         calS.setTime(endDate);  
  38.         int endY = calS.get(Calendar.YEAR);  
  39.         int endM = calS.get(Calendar.MONTH);  
  40.         //处理2011-01-10到2011-01-10,认为服务为一天  
  41.         int endD = calS.get(Calendar.DATE)+1;  
  42.         int endDayOfMonth = calS.getActualMaximum(Calendar.DAY_OF_MONTH);  
  43.           
  44.         StringBuilder sBuilder = new StringBuilder();  
  45.         if (endDate.compareTo(startDate)<0) {  
  46.             return sBuilder.append("过期").toString();  
  47.         }  
  48.         int lday = endD-startD;  
  49.         if (lday<0) {  
  50.             endM = endM -1;  
  51.             lday = startDayOfMonth+ lday;  
  52.         }  
  53.         //处理天数问题,如:2011-01-01 到 2013-12-31  2年11个月31天     实际上就是3年  
  54.         if (lday == endDayOfMonth) {  
  55.             endM = endM+1;  
  56.             lday =0;  
  57.         }  
  58.         int mos = (endY - startY)*12 + (endM- startM);  
  59.         int lyear = mos/12;  
  60.         int lmonth = mos%12;  
  61.         if (lyear >0) {  
  62.             sBuilder.append(lyear+"年");  
  63.         }  
  64.         if (lmonth > 0) {  
  65.             sBuilder.append(lmonth+"个月");  
  66.         }  
  67.         if (lday >0 ) {  
  68.             sBuilder.append(lday+"天");  
  69.         }  
  70.         return sBuilder.toString();  
  71.     }  
  72.       
  73.     /* 
  74.      * 转换 dataAndTime 2013-12-31 23:59:59 到 
  75.      * date 2013-12-31 
  76.      */  
  77.     public static String getDate(String dateAndTime){  
  78.         if (dateAndTime != null && !"".equals(dateAndTime.trim())) {  
  79.             Matcher   m   =  p.matcher(dateAndTime);   
  80.             if (m.find()) {  
  81.                   return dateAndTime.subSequence(m.start(), m.end()).toString();  
  82.             }  
  83.         }  
  84.         return "data error";  
  85.     }  
  86.       
  87.     public static void main(String[] args) {  
  88.         System.out.println(remainDateToString("2004-02-29""2005-04-01"));  
  89.         System.out.println("A");  
  90.         Date time1=new Date();  
  91.         SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
  92.         String tm=sdf.format(time1);//tm就是昨天的日期的字符串表示  
  93.         System.out.println(tm);  
  94.     }  

原文地址:https://www.cnblogs.com/firstdream/p/2360891.html