1

joda-time を使用して、2 つの日付の間の時間/日付コンポーネントを取得しています。( http://joda-time.sourceforge.net )

PeriodTypes をstandard()orとして使用するday()と、すべて正常に動作します。しかし、使用するPeriodType.forFields(...)と例外が発生します。

したがって、これは機能します:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.days()).normalizedStandard(PeriodType.days());
return p.getDays();

これは例外をスローします:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.forFields(new DurationFieldType[]{DurationFieldType.months(), DurationFieldType.weeks()})).normalizedStandard(PeriodType.forFields(new DurationFieldType[]{DurationFieldType.months(), DurationFieldType.weeks()}));
return p.getMonths();

私が間違っていることはありますか?どんな助けでも本当に感謝しています。

例外:

10-17 14:35:50.999: E/AndroidRuntime(1350): java.lang.UnsupportedOperationException: フィールドはサポートされていません 10-17 14:35:50.999: E/AndroidRuntime(1350): org.joda.time.PeriodType で.setIndexedField(PeriodType.java:690) 10-17 14:35:50.999: E/AndroidRuntime(1350): org.joda.time.Period.withYears(Period.java:896) 10-17 14:35:50.999 : E/AndroidRuntime(1350): at org.joda.time.Period.normalizedStandard(Period.java:1630)

編集:

これはバグだと確信しています。さらにいくつかの組み合わせをテストしましたが、年のない非標準の PeriodTypes に問題があるようです。例えば:

これは機能します:

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.standard()).normalizedStandard(PeriodType.standard());
return p.getMonths();

年の PeriodType を削除すると withYearsRemoved() 、例外が発生します。

Period p = new Period(new DateTime(startDate.getTime()), new DateTime(endDate.getTime()), PeriodType.standard().withYearsRemoved()).normalizedStandard(PeriodType.standard().withYearsRemoved());
return p.getMonths();
4

1 に答える 1

1

startDateこれは、との差がendDate年を超えていることを意味するため、normalized standard計算できません。

期間::正規化された標準から

期間に年または月が含まれる場合、月は 0 から 11 の間で正規化されます。日フィールド以下は必要に応じて正規化されますが、月フィールドにはオーバーフローしません。したがって、1 年 15 か月の期間は 2 年 3 か月に正規化されます。ただし、1 か月 40 日の期間は 1 か月 40 日のままです。

そのため、差額が1年以上ある場合はご利用いただけませんnormalizedStandard withYearsRemoved

例:

  DateTime startDate = new DateTime().minusYears(10);
  DateTime endDate = new DateTime();
  Period p = new Period(startDate, endDate, PeriodType.standard().withYearsRemoved())
     .normalizedStandard(PeriodType.standard().withYearsRemoved());
  p.getMonths(); // throw exception, difference is 10 years!  

  DateTime startDate = new DateTime().minusMonths(10);
  DateTime endDate = new DateTime();
  Period p = new Period(startDate, endDate, PeriodType.standard().withYearsRemoved())
     .normalizedStandard(PeriodType.standard().withYearsRemoved());
  p.getMonths(); // return 10, difference is less then 1 year  

  DateTime startDate = new DateTime().minusYears(10);
  DateTime endDate = new DateTime();
  Period p = new Period(startDate, endDate, PeriodType.standard().withYearsRemoved());
  p.getMonths(); // return 120, standart isn't normalized
于 2013-10-18T08:55:54.027 に答える