计算两个 Date 或 Calendar 对象之间的年数,考虑闰年
Calculating number of years between two Date or Calendar objects, considering leap years
因此,在我正在处理的 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 时间包和 java.time 但是我们明确需要使用 Date 和 Calendar 对象。任何人都知道如何做到这一点,最好是尽可能快速和优雅地完成?谢谢
编辑:似乎找到了有效的解决方案,见下文
检查这个可能对您有帮助的简单示例:
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 link 的一些想法):
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;
}
初步测试似乎从中获得了正确的输出,但我还没有进行更广泛的测试。
因此,在我正在处理的 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 时间包和 java.time 但是我们明确需要使用 Date 和 Calendar 对象。任何人都知道如何做到这一点,最好是尽可能快速和优雅地完成?谢谢
编辑:似乎找到了有效的解决方案,见下文
检查这个可能对您有帮助的简单示例:
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 link 的一些想法):
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;
}
初步测试似乎从中获得了正确的输出,但我还没有进行更广泛的测试。