计算两个日期或日历对象之间的年数,考虑闰年

时间:2016-04-25 11:14:44

标签: java date time calendar difference

因此,在我正在开发的Java项目中,我们需要使用日期和日历对象来表示日期。我写的方法要求日期至少是过去的某些年数,因此我需要能够准确地计算当前日期和给定日期或日历之间的年数。我已设法准确计算使用此实现之间的天数:

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

然而,我现在正在努力寻找一种方法来准确计算这些日期之间的年数,同时考虑闰年等。显然将上述方法的结果除以365或365.25并不是很有效。我知道joda time包和java.time但是我们明确需要使用Date和Calendar对象。任何人都知道如何做到这一点,最好尽可能快速和优雅?谢谢

编辑:似乎找到了有效的解决方案,见下文

2 个答案:

答案 0 :(得分:4)

我终于能够使用以下代码实现所需的功能(使用来自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;
}

初步测试似乎从中获得了正确的输出,但我还没有进行更广泛的测试。

答案 1 :(得分: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"); 
    }

}