Joda-Timeで特定の年の最大週数を取得するにはどうすればよいですか?
3 に答える
new DateTime().withYear(PARTICULAR_YEAR).weekOfWeekyear().getMaximumValue();
@codyコメント
2つの方法の違い
.withWeekOfWeekyear()
と.withWeekyear()
例
new DateTime().withDate(2011, 1, 2);
2/1/2011 : Sunday, last day of last week of 2010 (27/12/2010 - 2/1/2011)
dayOfWeek : 7
weekOfWeekyear : 52
weekyear : 2010
new DateTime().withDate(2011, 1, 3);
3/1/2011 : Monday, first day of first week of 2011 (3/1/2011 - 9/1/2011)
dayOfWeek : 1
weekOfWeekyear : 1
weekyear : 2011
この古い質問への回答は降霊術ですが、受け入れられた回答(lschinによる)にはバグがあります-ほとんどの場合、正しい値を返しますが、計算がいつ実行されたかによっては、間違った値を返すことがあります。例えば:
new DateTime().withYear(2014).weekOfWeekyear().getMaximumValue();
2014年12月28日に上記を実行すると、正しい値52が得られます。ただし、同じコードを1日後の2014年12月29日に実行すると、 53の値が返されます。特定の年には一定の週数があるため、これは明らかに問題です(メソッドが一部の時間だけ機能することを望まないという事実は言うまでもありません)。これをテストするには、システムの日付を変更するか、の代わりに固定の日付を使用しますnew Date()
。
ここでの問題は、年末に近い日付を返したweekOfWeekyear()
場合に、指定された年の値をインクリメントできることです。new DateTime()
これは、現在と来年の両方の週数が同じである場合は問題ではありませんが、そうでない場合は問題になります。したがって、これを修正するには、次を使用します。
new DateTime().withWeekyear(2014).weekOfWeekyear().getMaximumValue();
^^^^
これにより、まれに1年ごとに増分を変更せず、一貫して正しい結果を得ることができます。