2016-08-23 31 views
1

我剛開始使用Joda時間,一週後我對結果滿意。我正在嘗試獲取格式爲「yyyy-MM-dd HH」的兩個日期之間的時間範圍期限。Jodatime計算中的一個錯誤在兩個日期範圍(幾乎是一年)之間的期間

直到我來到了一個測試情況下,我寫作,在我看來,結果是錯誤的:

2014-02-05 05 - 2016年2月4日05

喬達結果:

Years: 1 Months: 11 Days: 2 Hours: 0

預期結果:

Years: 1 Months: 11 Days: 30 Hours: 0

我只需要1天多給它得到一個已滿2週歲....

我不是一個QA但可以肯定,這是對我的錯誤......我也跟我們對此的質量保證和她同意。

我想提出一個Github中的錯誤,但它指出我首先使用Stackoverflow ..任何澄清將不勝感激。

String hourFormat = "yyyy-MM-dd HH"; 
String startTime = "2014-02-05 05"; 
String endTime = "2016-02-04 05"; 
DateTimeFormatter hourFormatter = DateTimeFormat.forPattern(hourFormat); 
DateTime start = hourFormatter.parseDateTime(startTime); 
DateTime end = hourFormatter.parseDateTime(endTime ); 
Interval interval = new Interval(start, end); 
Period period = interval.toPeriod(); 
System.out.println(String.format(
    "Years: %d Months: %d Days: %d Hours: %d", 
    period.getYears(), period.getMonths(), period.getDays(), period.getHours() 
)); 
+0

請添加完整的代碼示例 – Krease

+0

爲了解決我的問題,我需要得到第11個月之後的確切日期和計算出日期和結束日期之間的天數。 **的DateTime daysStartTime = endTime.plusHours(1); ** ** INT天= Days.daysBetween(daysStartTime,結束).getDays(); ** – Rodel

+0

澄清 - 您的代碼示例演示他的問題不完整。請讓它成爲一個獨立的可編譯示例。 – Krease

回答

1

這似乎喜歡我的錯誤。當然,由於Interval實際上在內部存儲了開始日期和結束日期,因此它應該能夠正確轉換爲一個週期(interval.toPeriod())。

我打賭,當你直接從兩個日期(沒有中間步驟到Interval)直接計算Period時,它會工作得很好。例如:

Period period = new Period(start,end); 

或者,如果計算不與上週的差異是正確的,你可能需要使用(每Incorrect jodatime period - years months days爲):

Period period = new Period(start,end,PeriodType.yearMonthDay()); 

在Java 8 java.time.*庫的情況下(JSR- 310),Interval實際上被省略,只允許PeriodDuration。所以在Java中8,你可以做這樣的事情:

String hourFormat = "yyyy-MM-dd HH"; 
DateTimeFormatter hourFormatter = DateTimeFormatter.ofPattern(hourFormat); 
LocalDateTime start = LocalDateTime.parse("2014-02-05 05",hourFormatter); 
LocalDateTime end = LocalDateTime.parse("2016-02-04 05",hourFormatter); 

// Duration duration = Duration.between(start, end); 
Period period = Period.between(start.toLocalDate(), end.toLocalDate()); 

System.out.println(
    String.format("Years: %d Months: %d Days: %d Hours: xxx", 
    period.getYears(), period.getMonths(), period.getDays()) 
); 

其他明顯的限制是Period在JSR-310不僅擁有分辨率高達至天(而不是幾小時)。

參見本作進一步參考:Is there a class in java.time comparable to the Joda-Time Interval?

+0

是的,我明白這不是一個錯誤:)因爲我剛開始使用喬達時間,由於我沒有使用JDK 8的限制。 – Rodel

2

變化的代碼

Interval interval = new Interval(start, end); 
Period period = interval.toPeriod(); 

以下行

Period period = new Period(start, end, PeriodType.yearMonthDay()); 
+0

解決問題的好工作:)歡迎來到StackOverflow! – Krease

相關問題