2014-03-28 39 views
0

我試圖找到兩個日期之間的差異,並以 「0年0個月0天0小時0分0秒」的格式顯示它。我創建了一個方法,它需要兩個DateTime對象並返回一個表示差異的字符串。爲什麼Joda-Time-2.3返回不正確的區別?

這裏是方法:

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

出於好奇,你爲什麼不」你使用'Interval'? – fge

+0

我只是在學習如何使用Joda-Time,你會如何使用'Interval'對象? – JavaCodeBuilder

+1

請注意,'new DateTime()'總是會導致不同的結果,因爲當前時間會發生變化(時鐘不會停止)。所以如果你真的想比較兩種不同的算法,你應該使用固定的開始。 –

回答

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 = new Period(start, end, PeriodType.yearMonthDayTime()); 
    System.out.print(period.getYears() + " years, "); 
    System.out.print(period.getMonths() + " months, "); 
    // etc. 
+0

有一個問題。你應該真的指定'PeriodType',否則會有周組件。 –

+0

謝謝@MenoHochschild,你是對的。我已經糾正了答案。 –

+0

非常感謝您的信息。如果你看看我的最後一次編輯,你可以看到我現在使用的方法,並讓我知道是否有更有效的方法。 – JavaCodeBuilder

相關問題