2016-04-25 3 views
1

Итак, в проекте Java, над которым я работаю, мы должны использовать только Объекты даты и календаря для представления дат. Метод, который я пишу, требует, чтобы дата была, по крайней мере, определенным числом лет в прошлом, поэтому мне нужно иметь возможность точно рассчитать количество лет между настоящей и данной датой или календарем. Мне удалось точно рассчитать количество дней между использованием этой реализации:Расчет количества лет между двумя объектами Date или Calendar, учитывая високосные годы

public static long daysSince(Date pastDate) { 
    long millisecondsSince = new Date().getTime() - pastDate.getTime(); 
    return TimeUnit.DAYS.convert(millisecondsSince, TimeUnit.MILLISECONDS); 
} 

Однако теперь я изо всех сил, чтобы найти способ, чтобы точно рассчитать количество лет между этими датами в то время, принимая во внимание високосные годы и т.д. Очевидно, деление результата вышеуказанного метода на 365 или 365,25 не совсем работает. Я знаю о пакете времени joda и java.time, но мы явно должны работать с объектами Date и Calendar. Кто-нибудь понял, как это можно сделать, желательно как можно быстрее и элегантнее? Спасибо

EDIT: Показалось найти функционирующий решение, смотрите ниже

ответ

2

я, наконец, смог реализовать требуемую функциональность, используя следующий код (используя некоторые идеи из ссылки Haseeb AnSer компании):

public static int yearsSince(Date pastDate) { 
    Calendar present = Calendar.getInstance(); 
    Calendar past = Calendar.getInstance(); 
    past.setTime(pastDate); 

    int years = 0; 

    while (past.before(present)) { 
     past.add(Calendar.YEAR, 1); 
     if (past.before(present)) { 
      years++; 
     } 
    } return years; 
} 

Предварительные тесты, кажется, получают правильный вывод из этого, но я еще испытать более обширны LY.

+0

+1 Я не знаю, проще ли это от того, что мы сравниваем, потому что у меня нет петель в мой код, который должен заставить мой код работать быстрее. Но рад, что вы внедрили решение – sebenalern

1

Проверьте этот простой пример, это может помочь вам:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class GetNumberOfYearsBetweenTwoDate { 

    public int getNumberOfYearsBetweenTwoDate(String strDate1, String dateFormat1, 
    String strDate2, String dateFormat2) { 
     int years = 0; 

     Date date1, date2 = null; 
     SimpleDateFormat sdf1 = new SimpleDateFormat(dateFormat1); 
     SimpleDateFormat sdf2 = new SimpleDateFormat(dateFormat2); 
     SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy"); 

     try { 
      date1 = (Date)sdf1.parse(strDate1); 
      date2 = (Date)sdf2.parse(strDate2); 

      int year1 = Integer.parseInt(sdfYear.format(date1)); 
      int year2 = Integer.parseInt(sdfYear.format(date2)); 

      years = year2 - year1; 
     } catch (ParseException ex) { 
      System.err.println(ex.getMessage()); 
     } 

     return years; 
    } 

    public static void main(String[] args) { 
     String strDate1 = "13-10-1988"; 
     String dateFormat1 = "dd-MM-yyyy"; 

     String strDate2 = "2011-10-13"; 
     String dateFormat2= "yyyy-MM-dd"; 

     GetNumberOfYearsBetweenTwoDate gnoybtd = new 
     GetNumberOfYearsBetweenTwoDate(); 
     int years = gnoybtd.getNumberOfYearsBetweenTwoDate(strDate1, dateFormat1, 
     strDate2, dateFormat2); 

     System.out.println("Number of Years: "+years+" Years"); 
    } 

} 
+0

Спасибо, но разве это просто не вычитает значение года прошлой даты из значения года текущей даты? я мог бы иметь две даты: настоящую (2016-25-4) и прошлую дату, скажем 2015-31-12. С вашим методом это будет рассчитываться как 2016-2015 = 1 год, однако на самом деле прошло всего 5 месяцев. Для моего проекта очень важно, чтобы я подсчитал количество лет, прошедших до дня_, с учетом високосных лет. Спасибо, хотя – transiti0nary

+0

Посмотрите ответы на этот вопрос, вы можете получить любую ценную помощь :) http://stackoverflow.com/questions/2846135/how-do-i-calculate-the-number-of-years-difference -between-2-date –

+0

Спасибо. Я смог реализовать решение, используя часть кода, который вы связали. Я добавлю его в качестве ответа. – transiti0nary

Смежные вопросы