title: Java method to find difference between 2 date objects in years, months and days
body: <p>I have a start date and end date. the duration between the 2 dates should be in the form of years, months and days. I am new to java. 
  When I run the below method the out I get is 0 years, 12 months 1 days.
  Please suggest an alternative to get accurate difference in years, months and days.</p>
  
  <pre><code>import java.sql.Date;
  import java.text.ParseException;
  import java.text.SimpleDateFormat;
  import java.util.*;
  
  public class Duration {
  
      private String getAssignmentDuration(java.util.Date oldDate, java.util.Date newDate) {
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          if (oldDate.compareTo(newDate) &gt; 0) {
              c1.setTime(newDate);
              c2.setTime(oldDate);
          } else {
              System.out.println("invalid");
              return "Invalid selection";
  
          }
          int year = 0;
          int month = 0;
          int days = 0;
          boolean doneMonth = false;
          boolean doneYears = false;
          while (c1.before(c2)) {
              //log.debug("Still in Loop");
              if (!doneYears) {
                  c1.add(Calendar.YEAR, 1);
                  year++;
              }
              if (c1.after(c2) || doneYears) {
                  if (!doneYears) {
                      doneYears = true;
                      year--;
                      c1.add(Calendar.YEAR, -1);
                  }   
                  if (!doneMonth) {
                      c1.add(Calendar.MONTH, 1);
                      month++;
                  }
                  if (c1.after(c2) || doneMonth) {
                      if (!doneMonth) {
                          doneMonth = true;
                          month--;
                          c1.add(Calendar.MONTH, -1);
                      }
  
                      c1.add(Calendar.DATE, 1);
                      days++;
                      if (c1.after(c2)) {
                          days--;
                      }
                      // this will not be executed
                      if (days == 31 || month==12) {
                          break;
                      }
                  }
              }
          }
          System.out.println(year + " years, " + month + " months, " + days + " days");
          return year + " years, " + month + " months, " + days + " days";
  
      }
  
  
      public static void main(String[] args) {
          Duration d1= new Duration();
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
          java.util.Date oldDate = null;
          try {
              oldDate = sdf.parse("2012/08/29");
          } catch (ParseException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          java.util.Date newDate = null;
          try {
              newDate = sdf.parse("2013/08/31");
          } catch (ParseException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          d1.getAssignmentDuration(oldDate, newDate);
      }
  
  }
  </code></pre>