2017-01-30 13 views
2

私はアンドロイドアプリで任意の2つの時間の差を計算しようとしています。このタスクを達成するために、私はPeriodのgetYears()、getDays()、getHours()、getMinutes()、およびgetSeconds()メソッドと共にJodaTimeとPeriodクラスを使用していました。しかし、それは、それが日付の各要素の間の絶対的な違いと思われるものを与えていることに気付きました。たとえば、日付に私の関数を呼び出す2017-01-29 00:00:00 (yyyy-MM-dd HH:mm:ss)2018-01-28 00:00:00が返されます:JodaTimeの期間が予期しない結果を返す

0 years 
2 days 
0 hours 
0 minutes 
0 seconds 

それは他のすべてのセクションにゼロと一緒に364 daysを返す必要があるとき。もちろん、それはアンドロイドアプリですので、私はそれらを印刷していません、私は別にディスプレイを処理しています。 LocalDateTimeとDuration.betweenを使用して私のコンピュータでこれを行うことができましたが、ここではこれらのクラスを使用することはできません。私は、私の現在の方法(下記)の修正か、まったく新しいアプローチの提案を探しています。前もって感謝します。 私の現在の機能:

public int[] getDifference(DateTime start, DateTime end){ 
    Period p = new Period(start, end); 
    int[] differences = new int[5]; 
    differences[0] = p.getYears(); 
    differences[1] = p.getDays(); 
    differences[2] = p.getHours(); 
    differences[3] = p.getMinutes(); 
    differences[4] = p.getSeconds(); 
    return differences; 
} 
+0

長さはあなたが望むものです - なぜあなたはそれを使用できませんか? – GreyBeardedGeek

答えて

0

なぜ364日お待ちですか? class doc for Periodを読んでください。

公共int型getDays()

は、期間の日数フィールドの一部を取得します。

「フィールドの部分」がここにあります。 Periodは、年、月、週、日、時、分、秒、およびミリ秒の数値です。例えば、一年半は二つの部分、年1の一部と6

あなたの出力の一部がヶ月一部飛ばし月と週間部分を持っているでしょう。

DateTime start = new DateTime (2017 , 1 , 29 , 0 , 0 , DateTimeZone.UTC); 
DateTime stop = new DateTime (2018 , 1 , 28 , 0 , 0 , DateTimeZone.UTC); 
Period p = new Period (start , stop); 
int[] differences = new int[ 7 ]; 
differences[ 0 ] = p.getYears(); 
differences[ 1 ] = p.getMonths(); 
differences[ 2 ] = p.getWeeks(); 
differences[ 3 ] = p.getDays(); 
differences[ 4 ] = p.getHours(); 
differences[ 5 ] = p.getMinutes(); 
differences[ 6 ] = p.getSeconds(); 
System.out.println ("differences: " + Arrays.toString (differences)); 

実行すると、11か月、4週間、および2日間が表示されます。 MacOS El CapitanのJava 8 Update 121でJoda-Time 2.8.2を実行しています。

違い:[0、11、4、2、0、0、0]

あなたはtoStandardDaysを呼び出すのではと思うかもしれません。しかしそのようにすると、例外として「java.lang.UnsupportedOperationException」と表示されます。「この期間に月と月が含まれているため、日にちに変換できません」

java.time FYI

:今maintenance modeJoda-Timeプロジェクトは、java.timeクラスへの移行をアドバイスします。

java.timeでは、タイムラインに関連付けられていない期間は、java.time.Periodの年月日またはjava.time.Durationの時間 - 分 - 秒のナノ秒のいずれかで表されます。

LocalDateクラスは、時間帯のない時間帯のない日付のみの値を表します。

java.timeクラスは、代わりにファクトリメソッドを使用してコンストラクタを使用しません。

LocalDate start = LocalDate.of (2017 , 1 , 29); 
LocalDate stop = LocalDate.of (2018 , 1 , 28); 
Period period = Period.between (start , stop); 
System.out.println ("period.toString(): " + period); 

toStringstandard ISO 8601 format for durations内のテキストの断片を生成します。ここでは11ヶ月と30日を見ます。明らかにJoda-Timeとjava.timeのカウントは異なっています。ここではさまざまな結果が見られます。 Joda-Timeは数週間をカウントしますが、java.timeはカウントしません。

period.toString():P11M30D

0

ますあなたは年に特有の正規化をしたいので、また、適切な期間タイプを設定する必要があり、日、時間、分、秒だけ、また、Javadocを参照してください。

LocalDateTime start = new LocalDateTime(2017, 1, 29, 0, 0); 
LocalDateTime end = new LocalDateTime(2018, 1, 28, 0, 0); 
Period p = new Period(start, end, PeriodType.yearDayTime().withMillisRemoved()); 
System.out.println(p); // P364D (what you expected) 

この例では、開始と終了のタイプがDateTimeになります。

このコード例(Joda-Time自身のクラスPeriod)は、Java-8に含まれる新しいjava.time -APIに完全に移行できないことに注意してください。後者のAPIは日付と時刻のコンポーネントを含む期間を処理できないためです。また、期間タイプを指定することもできません。すなわち、PeriodTypeのように正規化を制御できません。

関連する問題