週と年を指定して、次の週と年を返す関数が欲しいのですが。次のようになります。
public static int[] getNextWeek(int year, int week) {
Calendar c = Calendar.getInstance(); // I'm Locale.US and TimeZone "America/New_York"
c.clear();
c.set(Calendar.YEAR, year);
c.set(Calendar.WEEK_OF_YEAR, week);
c.add(Calendar.WEEK_OF_YEAR, 1);
return new int[] {c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)}
}
これは、年の境界を回避できない場合があります。呼び出す日と使用するパラメーターによって異なるようです。たとえば、2012年と52週で呼び出すと、結果は2013年と1週になると予想されます。今日(2012年7月17日火曜日)に呼び出すと、機能します。曜日を昨日に設定した場合は、そうではありません。そして奇妙なことに、2012年の第1週に結果が出ます。何が起こっている?2012年の最後の2日間であるSUNDAYまたはMONDAYで呼び出された場合は機能しないため、曜日に関連しているようです。曜日を週の最後の日に設定すると、関数は機能しているように見えます。Calendar.add()を呼び出す前に、次のことを行います。
// Must set to last day of week; initially set to first day due to API
c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // SUNDAY
c.add(Calendar.DAY_OF_WEEK, 6); // Must roll forward not backwards
getPreviousWeekメソッドを作成した場合、このような奇妙なことはないようです。これはjava.util.Calendarのバグですか?次回は城田時間を使うと思います!