4

週と年を指定して、次の週と年を返す関数が欲しいのですが。次のようになります。

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のバグですか?次回は城田時間を使うと思います!

4

3 に答える 3

2

ISO8601週アルゴリズムが、その年の最初の週を、その年に少なくとも4日含まれる週と見なすという事実を考慮しましたか?

したがって、1月1日が木曜日である場合、その週は実際には前年の第52週と見なされ、今年の第1週とは見なされません。

ISO規格を適切に処理しているため、この種の計算では少なくともjoda-timeを検討することをお勧めします。

    LocalDate ld = new LocalDate();
    ld = ld.withWeekOfWeekyear(29);
    ld = ld.withWeekyear(2012);

    System.out.println(ld.getWeekOfWeekyear());
    System.out.println(ld.getWeekyear());

    // 29
    // 2012


    System.out.println(ld.plusWeeks(1).getWeekOfWeekyear());
    System.out.println(ld.plusWeeks(1).getWeekyear());
    // 30
    // 2012

そして、これは年の境界を越えて機能します。

于 2012-07-18T02:49:43.250 に答える
1

ロールオーバーがあるかどうかを確認するために明示的なチェックを行うだけです。

return new int[] {c.get(Calendar.WEEK_OF_YEAR) == 1 ? c.get(Calendar.YEAR) + 1 :
    c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)};

WEEK_OF_YEAR私の知る限り、正しく追加されない理由は、、、、、、、CalendarなどSECONDの実際MINUTEのプロパティMONTHではないためDAYですYEAR。のような派生プロパティですWEEK_OF_MONTH。これを回避する1つの方法はc.add(Calendar.DAY, 7)、をインクリメントする代わりに、正確に7日を追加するために使用することWEEK_OF_YEARです。

于 2012-07-17T14:26:07.923 に答える
1

この時点で、これは本当にバグであると想定します。ここにOracleのバグレポートを記入しました。

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7197761

于 2012-09-19T18:59:33.840 に答える