2016-08-23 6 views
1

Joda Timeを使い始めたばかりで、今週は結果に満足しました。私は 'yyyy-MM-dd HH'の形式の2つの日付の間の時間範囲期間を取得しようとしています。Jodatimeのバグ2の日付範囲(1年にALMOST)の間の期間を計算する

私は私が書いていたテストケースに来て、結果が間違っている私には思えるまで:

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

ジョダ結果:

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

期待される結果:

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

私は、私はQAないですが、確かに、これは私にはバグがある

.... FULL 2年にそれを得るために1より多くの日必要があります...私はまたに話を聞きましたこれについての私たちの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 = new Interval(start, end); 
Period period = interval.toPeriod(); 

の次の行これが私にはバグのように思えるん。間違いなく、Intervalは実際に開始日と終了日を内部的に格納するため、期間(interval.toPeriod())に適切な変換を行うことができるはずです。

Periodを2つの日付から直接計算すると(中間ステップを使わずにIntervalになる)、うまくいくはずです。例:

Period period = new Period(start,end); 

または計算は、一週間の違いで正しくない場合、あなたは(Incorrect jodatime period - years months daysあたりとして)使用する必要があります。Java 8 java.time.*ライブラリ(JSR-の場合

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

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()) 
); 

その他の明白な制限は、JSR-310でPeriodだけ日間(ない時間)のアップに解像度を持っているということです。

もさらに参照を参照してください:Is there a class in java.time comparable to the Joda-Time Interval?

+0

ええ、私はバグではないことを理解しています:) JDK 8を使用しないという私の制限のため、Joda Timeを使い始めたばかりです。 – Rodel

2

変更

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

問題を解決してくれてうれしい仕事:)そしてStackOverflowへようこそ! – Krease

関連する問題