Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算两个日期或日历对象之间的年数,考虑闰年_Java_Date_Time_Calendar_Difference - Fatal编程技术网

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

Java 计算两个日期或日历对象之间的年数,考虑闰年,java,date,time,calendar,difference,Java,Date,Time,Calendar,Difference,所以在我正在进行的一个Java项目中,我们只需要使用Date和Calendar对象来表示日期。我正在写的一个方法要求一个日期至少是过去的若干年,所以我需要能够准确地计算出现在和给定日期或日历之间的年数。我已成功准确计算了使用此实施之间的天数: public static long daysSince(Date pastDate) { long millisecondsSince = new Date().getTime() - pastDate.getTime(); return

所以在我正在进行的一个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,但是我们明确需要处理日期和日历对象。有没有人知道如何做到这一点,最好是尽可能快和优雅?多谢各位


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

检查这个简单的示例,它可能会帮助您:

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"); 
    }

}

我最终能够使用以下代码实现所需的功能(使用Haseeb Anser链接中的一些想法):


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

谢谢,但这不是简单地从当前日期的年份值中减去过去日期的年份值吗?i、 e我可以有两个日期:现在(2016-25-4)和过去的日期,比如2015-31-12。根据您的方法,这将计算为2016-2015年=1年过去,但实际上只过去了短短的5个月。对于我的项目来说,考虑到闰年,我能计算到今天已经过去的年数是至关重要的。如果你看一下这个问题的答案,你可能会得到任何有价值的帮助:)谢谢。我能够使用您链接的一些代码实现一个解决方案。我将把它作为一个答案添加。@0你能编辑这个答案并添加新的代码吗?这样它将来也可以帮助其他人+1我不知道它是否更简单,这取决于我们正在比较什么,因为我的代码中没有循环,这会使我的代码运行得更快。但很高兴你实施了一个解决方案
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;
}