Joda Years.yearsBetween?

时间:2014-11-26 15:57:18

标签: java datetime jodatime gregorian-calendar

我有2个DateTime值:date1 = "1492-10-12"date2 = "1992-10-12"。 当我使用Years.yearsBetween(date1, date2).getYears()时,我得到 499 。我期待 500 。 如果我使用date1 = "1892-10-12"date2 = "1992-10-12",那么我会100

在诊断问题时,我发现当我有2个DateTime值时,问题首先出现:date1 = "1492-10-12"date2 = "1583-10-12"。当我 91 时,我 90 年。当date2 = "1582-10-12"或更早时,计算是正确的。

我假设这是因为格里高利历从 1582 开始,但我不确定为什么我们一年假。有任何想法吗? 499 在理论上是正确的还是在 1582 属于开始日期和结束日期之间的年份有问题吗?

我的代码如下:

Date date1 = null;
Date date2 = null;
try {
    date1 = sdf.parse("1492-10-12");
    date2 = sdf.parse("1992-10-12");
} 
catch (ParseException e) {
    e.printStackTrace();
}
int yrs = computeDiffInYears(date1, date2);  ?? yrs = 499

private static int computeDiffInYears(Date date1, Date date2) {
    DateTime dt1 = (new DateTime(date1));
    DateTime dt2 = (new DateTime(date2));
    return Years.yearsBetween(dt1, dt2).getYears();
}

UPDATE:如果我按照Anarki的建议重写方法computeDiffInYears:

private static int computeDiffInYears(Date date1, Date date2) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    DateTime dt1 = new DateTime(sdf.format(date1));
    DateTime dt2 = new DateTime(sdf.format(date2));
    return Years.yearsBetween(dt1, dt2).getYears();
}

然后它正常工作

2 个答案:

答案 0 :(得分:0)

可能是Joda不包括实际的“到”日期,而是前一天。在这种情况下,计算是正确的。

答案 1 :(得分:0)

你可以试试这个:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    Date first = sdf.parse("12-10-1492");
    Date last = sdf.parse("12-10-1992");
    System.out.println(getDiffYears(first, last));
}

public static int getDiffYears(Date first, Date last) {
    Calendar a = getCalendar(first);
    Calendar b = getCalendar(last);
    int diff = b.get(Calendar.YEAR) - a.get(Calendar.YEAR);
    if (a.get(Calendar.MONTH) > b.get(Calendar.MONTH)
            || (a.get(Calendar.MONTH) == b.get(Calendar.MONTH) && a.get(Calendar.DATE) > b.get(Calendar.DATE))) {
        diff--;
    }
    return diff;
}

public static Calendar getCalendar(Date date) {
    Calendar cal = Calendar.getInstance(Locale.US);
    cal.setTime(date);
    return cal;
}

打印500女巫是正确的。

修改

我刚试过这个(使用Joda):

public static void main(String[] args) throws ParseException {
    DateTime date1 = new DateTime("1492-10-12");
    DateTime date2 = new DateTime("1992-10-12");
    int yrs = computeDiffInYears(date1, date2);
    System.out.println(yrs);
}

private static int computeDiffInYears(DateTime date1, DateTime date2) {
    return Years.yearsBetween(date1, date2).getYears();
}

它也会打印500,但是当我尝试从Date转换为DateTime时它打印499,所以你应该只使用DateTime或Calendar。