2

2 月については、Joda-Time の誤った結果で確認できる奇妙な動作があります。ここで確認できます。

DateTime date1 = new DateTime(2013, 4, 28, 0, 0, 0, 0);
DateTime date1PlusNineMonths = new DateTime(2014, 1, 28, 0, 0, 0, 0);
Period period1 = new Period(date1, date1PlusNineMonths);
//Correct result
System.out.print(date1.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date1.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period1.getYears() + "Years/" + period1.getMonths() + "Months/" + period1.getWeeks() + "Weeks/" + period1.getDays() + "Days");

DateTime date2 = new DateTime(2013, 4, 29, 0, 0, 0, 0);
DateTime date2PlusNineMonths = new DateTime(2014, 1, 28, 0, 0, 0, 0);
Period period2 = new Period(date2, date2PlusNineMonths);
//Correct result
System.out.print(date2.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date2.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period2.getYears() + "Years/" + period2.getMonths() + "Months/" + period2.getWeeks() + "Weeks/" + period2.getDays() + "Days");

DateTime date3 = new DateTime(2013, 5, 28, 0, 0, 0, 0);
DateTime date3PlusNineMonths = new DateTime(2014, 2, 28, 0, 0, 0, 0);
Period period3 = new Period(date3, date3PlusNineMonths);
//Correct result
System.out.print(date3.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date3.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period3.getYears() + "Years/" + period3.getMonths() + "Months/" + period3.getWeeks() + "Weeks/" + period3.getDays() + "Days");

DateTime date4 = new DateTime(2013, 5, 29, 0, 0, 0, 0);
DateTime date4PlusNineMonths = new DateTime(2014, 2, 28, 0, 0, 0, 0);
Period period4 = new Period(date4, date4PlusNineMonths);
//Incorrect result
System.out.print(date4.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date4.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period4.getYears() + "Years/" + period4.getMonths() + "Months/" + period4.getWeeks() + "Weeks/" + period4.getDays() + "Days");

DateTime date5 = new DateTime(2013, 5, 30, 0, 0, 0, 0);
DateTime date5PlusNineMonths = new DateTime(2014, 2, 28, 0, 0, 0, 0);
Period period5 = new Period(date5, date5PlusNineMonths);
//Incorrect result
System.out.print(date5.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date5.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period5.getYears() + "Years/" + period5.getMonths() + "Months/" + period5.getWeeks() + "Weeks/" + period5.getDays() + "Days");

DateTime date6 = new DateTime(2013, 5, 31, 0, 0, 0, 0);
DateTime date6PlusNineMonths = new DateTime(2014, 2, 28, 0, 0, 0, 0);
Period period6 = new Period(date6, date6PlusNineMonths);
//Incorrect result
System.out.print(date6.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date6.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period6.getYears() + "Years/" + period6.getMonths() + "Months/" + period6.getWeeks() + "Weeks/" + period6.getDays() + "Days");

DateTime date7 = new DateTime(2013, 6, 1, 0, 0, 0, 0);
DateTime date7PlusNineMonths = new DateTime(2014, 3, 1, 0, 0, 0, 0);
//Correct result
Period period7 = new Period(date7, date7PlusNineMonths);
System.out.print(date7.toString("dd/MM/YYYY") + ".plusMonths(9) = " + date7.plusMonths(9).toString("dd/MM/YYYY"));
System.out.print(period7.getYears() + "Years/" + period7.getMonths() + "Months/" + period7.getWeeks() + "Weeks/" + period7.getDays() + "Days");

通常、テスト(期間4、期間5、期間6)では、毎回9月と0日を表示するのではなく、日を変更する必要があります。これは正常ですか?jodaフレームワークの使用が間違っている可能性があり、実行すると出力が正しくなります.addMonth(9)オン01/06/2013

出力:

28/04/2013.plusMonths(9) = 28/01/2014 //correct result

0Years/9Months/0Weeks/0Days //correct calculation

29/04/2013.plusMonths(9) = 29/01/2014 //correct result

0Years/8Months/4Weeks/2Days //correct calculation

28/05/2013.plusMonths(9) = 28/02/2014 //correct result

0Years/9Months/0Weeks/0Days //correct calculation

29/05/2013.plusMonths(9) = 28/02/2014 //incorrect result should be 29/02/2014

0Years/9Months/0Weeks/0Days //correct calculation

30/05/2013.plusMonths(9) = 28/02/2014 //incorrect result should be 01/03/2014

0Years/9Months/0Weeks/0Days //incorrect calculation, should be 0Years/8Months/4Weeks/2Days

31/05/2013.plusMonths(9) = 28/02/2014 //incorrect result should be 01/03/2014

0Years/9Months/0Weeks/0Days //incorrect calculation, should be 0Years/8Months/4Weeks/1Days

01/06/2013.plusMonths(9) = 01/03/2014 //correct result

0Years/9Months/0Weeks/0Days //correct calculation
4

3 に答える 3

2

なぜこの結果が間違っていると思いますか?
は日数ではありません。は抽象単位

したがって、月の最終日プラス月は翌月の最終日であり、翌月の翌月初日ではありません。

なぜそう思うの

30/05/2013.plusMonths(9) = 28/02/2014 //間違った結果は 01/03/2014 になるはずです

なぜ02/03/2014ですか?

あなたの仮説は間違っています。あなたの例では Joda time がうまく機能します

于 2013-06-12T18:27:44.617 に答える
0

疲れていたので間違えました笑 なぜ 2014 年がうるう年だと確信していたのかはわかりませんが、いずれにせよ、私は月と日の計算に重点を置いていました。

        DateTime date4 = new DateTime(2013, 5, 29, 0, 0, 0, 0);
        DateTime date4PlusNineMonths = new DateTime(2014, 2, 28, 0, 0, 0, 0);
        Period period4 = new Period(date4, date4PlusNineMonths);
        //Incorrect result
        System.out.print(date4.toString("dd/MM/YYYY")+".plusMonths(9) = "+ date4.plusMonths(9).toString("dd/MM/YYYY"));
        System.out.print(period4.getYears() +"Years/"+ period4.getMonths() +"Months/"+ period4.getWeeks() +"Weeks/"+ period4.getDays() +"Days");

出力:

0Years/9Months/0Weeks/0Days

これは間違った計算です 0Years/8Months/4Weeks/2Days のはずですよね...?

それが正しければ、2 日 (30 と 31) を増やすと、常に同じ計算 (0Years/9Months/0Weeks/0Days) が得られるのはなぜですか?

私が開発したアプリでは、2 つの日付 (toDay と次の日付) の間の正確な月間隔を確保するために期間を毎日チェックしているため、joda フレームワークの使用が間違っている可能性があります。遅く、アプリで必要に応じて 9 か月と 0 日が必要です =/

私が間違っている場合、どうすればこれを達成できますか...?

于 2013-06-14T07:55:43.397 に答える
0

申し訳ありませんが、今のところ解決策はまったくありません。Joda のアーキテクトである S. Colebourne は、後方互換性の問題から、彼の周期計算の方法を主張しなければならないと思います。とにかく、彼はjoda-time/github の対応する問題を、バグではない/修正しないとしてクローズしました。そこにあるリンクをたどると、彼はjodaのjavadocの更新で、彼の期間計算方法は正しいと言います。

[2013 年 5 月 29 日] + P9M = [2014 年 2 月 28 日]

私の意見では、この議論はかなり弱いです。

[2013 年 5 月 29 日] + P8M30D = [2014 年 2 月 28 日]

したがって、加算算術のみに基づいて、どの期間が正しいかを明確に示すものはありません。期間計算の動作を明確に指定するには、次のような仕様があれば、はるかに優れたソリューションになります。月。シンプルでわかりやすい。また、 LocalDate の状態は年、月、日のみに基づいているため、週を期間計算の主要な部分にする必要があるとは確信していません。したがって、P8M4W2D (ISO-8601 と互換性がありません!) と言う代わりに、ソリューション P8M30D が望ましいです。

于 2013-06-16T20:15:11.550 に答える