2015-03-25 53 views
0

所以我有兩個日期選擇器的開始和結束時間,它們返回DateTime。JodaTime無法正常化PeriodType

我需要以「小時小時分鐘」格式計算這兩次之間的持續時間,例如「1小時30分鐘」。 如果有一天的差異,它會顯示「24小時」,所以我們使用小時而不是幾天。

我遇到的問題是,無論我得到這個工作,它會打破,如果用戶選擇一個月前。他們從來不應該選擇一個月,而是可以選擇。

我得到這個錯誤:

java.lang.UnsupportedOperationException: Unable to normalize as PeriodType is missing either years or months but period has a month/year amount: P1M3W6DT1H 
     at org.joda.time.Period.normalizedStandard(Period.java:1640) 

而且我的代碼是:

Period durationHoursAndMinutes = new Period(startDate.toLocalDateTime(), endDate.toLocalDateTime()).normalizedStandard(PeriodType.time()); 
PeriodFormatter formatter = new PeriodFormatterBuilder() 
    .appendHours() 
    .appendSuffix(getResources().getString(R.string.mytrips_tripview_rail_waitTime_hr)) 
    .appendSeparator(" ") 
    .appendMinutes() 
    .appendSuffix(getResources().getString(R.string.mytrips_tripview_rail_waitTime_min)) 
.toFormatter(); 

if(durationHoursAndMinutes.getMinutes() > 0){ 
    return formatter.print(durationHoursAndMinutes); 
}else { 
    return null; 
} 

我看着爲PeriodType的代碼和它說,拋出異常,如果個月= 0,它不會。只是想知道是否有辦法解決這個問題。 感謝您的幫助

+0

你能舉一個簡短但完整的例子來證明這個問題嗎? (你可能不需要你的格式化器 - 它幾乎肯定不需要在Android上,一個小的控制檯應用程序展示了這個問題會使這個更清晰。) – 2015-03-25 12:03:04

+0

請注意,你的要求,幾個月不會! = 0顯然是錯誤的報告失敗期間:P1M3W6DT1H – 2015-03-25 12:04:38

+0

@JonSkeet我剛剛在代碼中看到它說了一些關於拋出異常如果月!= 0 – goodgamerguy 2015-03-25 12:11:51

回答

4

嫌疑做到這僅僅是給PeriodType傳入構造,而不是最簡單的方法:

new Period(
    startDate.toLocalDateTime(), 
    endDate.toLocalDateTime(), 
    PeriodType.time()); 

那麼你不需要執行任何其他正常化。

+0

偉大的工作!感謝解決方案,我使用了標準化,因爲我在另一個堆棧溢出解決方案中看到了它。 – goodgamerguy 2015-03-25 12:31:34