为什么Joda-Time-2.3会返回不正确的区别?

时间:2014-03-28 12:46:14

标签: java date datetime jodatime difference

我试图找到两个日期之间的差异并以格式显示 " 0年0个月0天0小时0分0秒"。我创建了一个方法,它接受两个DateTime个对象,并返回一个表示差异的字符串。

以下是方法:

public static String getReadableDifference(DateTime start, DateTime end){

    int years = Years.yearsBetween(start, end).getYears();
    end = end.minusYears(years);
    int months = Months.monthsBetween(start, end).getMonths();
    end = end.minusMonths(months);
    int days = Days.daysBetween(start, end).getDays();
    end = end.minusDays(days);
    int hours = Hours.hoursBetween(start, end).getHours();
    end = end.minusHours(hours);
    int minutes = Minutes.minutesBetween(start, end).getMinutes();
    end = end.minusMinutes(minutes);
    int seconds = Seconds.secondsBetween(start, end).getSeconds();

    StringBuilder returnString = new StringBuilder(); 

    if(years != 0){
        returnString.append(years);
        returnString.append(" years ");
    }
    if(months != 0){
        returnString.append(months);
        returnString.append(" months ");
    }
    if(days != 0){
        returnString.append(days);
        returnString.append(" days ");
    }
    if(hours != 0){
        returnString.append(hours);
        returnString.append(" hours ");
    }
    if(minutes != 0){
        returnString.append(minutes);
        returnString.append(" minutes ");
    }
    if(seconds != 0){
        returnString.append(seconds);
        returnString.append(" seconds ");
    }

    return returnString.toString();
}

然后,我创建了两个DateTime个对象,并使用该方法计算差异。如果我这样初始化DateTime个对象,(start在这种情况下等于2014-03-28T12:56:38.137+01:00end将从完整程序中的文件中读取。)

 DateTime start = new DateTime();
 DateTime end = DateTime.parse("2015-03-28T12:56:35.137+01:00");

结果输出为11 months 31 days -3 seconds,但如果我初始化DateTime个对象,那么

DateTime now = DateTime.parse(new DateTime().toString());
DateTime end = DateTime.parse("2015-03-28T12:56:35.137+01:00");

结果输出将是原始初始化中预期的11 months 30 days 23 hours 59 minutes 57 seconds

我的问题是:为什么第一种初始化方法产生不正确的输出,为什么第二种方法产生正确的输出,为什么输出不一样?

虽然它没有解释这个问题,但这是我决定使用时差的方法:

 String string = new Period(start, end, PeriodType.yearMonthDayTime())
    .toString(new PeriodFormatterBuilder()
    .appendYears().appendSuffix(" year", " years").appendSeparator(" ")
    .appendMonths().appendSuffix(" month", " months").appendSeparator(" ")
    .appendDays().appendSuffix(" day", " days").appendSeparator(" ")
    .appendHours().appendSuffix(" hour", " hours").appendSeparator(" ")
    .appendMinutes().appendSuffix(" minute", " minutes").appendSeparator(" ")
    .appendSeconds().appendSuffix(" second", " seconds").toFormatter());     

1 个答案:

答案 0 :(得分:3)

您的问题必须在代码中的其他位置,可能您正在修改开始/现在日期。

以下结果相同:

    DateTime start = new DateTime();
    DateTime now = DateTime.parse(start.toString());
    DateTime end = DateTime.parse("2015-03-28T12:56:35.137+01:00");

    System.out.println("Start=" + start);
    System.out.println("Now  =" + now);

你也可以使用JodaTime的Period来做漂亮的打印,也许更容易阅读:

    Period period = new Period(start, end, PeriodType.yearMonthDayTime());
    System.out.print(period.getYears() + " years, ");
    System.out.print(period.getMonths() + " months, ");
    // etc.