6

Java のカレンダーなどを使用して、日付を 2012-10-26 に設定したとします。この日付を年の最初の日にしたい。年の最初の週が 2012-10-26 から始まると仮定して、特定の日付の週番号を取得することは可能ですか?それは 2012-12-10 です。

私の質問は少し奇妙に聞こえるかもしれませんが、有用な入力を使用できます。

ありがとう。

- 詳細

WeeklyScheduleというデータベース テーブルがあります。このテーブルには、Week1からWeek52までの列があり、すべての列にはその週の曜日に関するデータがあります。残念ながら、Week1は実際には年の最初の週ではありません。Week1が2012-08-26から始まると仮定して、計算を行う必要があります。

4

2 に答える 2

2

Calendar API を使用したアプローチの 1 つを次に示します。

private static final Calendar START_CAL = createAugust26th2012Cal();

public int getWeekNumber(Calendar someCal) {
    int theWeek = someCal.get(Calendar.WEEK_OF_YEAR);
    int weekCount = 0;
    while (theWeek != START_CAL.get(Calendar.WEEK_OF_YEAR)) {
        someCal.add(Calendar.WEEK_OF_YEAR, -1);
        theWeek = someCal.get(Calendar.WEEK_OF_YEAR);
        weekCount++;
    }
    return weekCount;
}

または、2 つのカレンダー間の差分 (ミリ秒単位) を取得し、その結果を 1 週間のミリ秒数で割ることもできます。

このアプローチを使用する場合は、TimeZones と夏時間を考慮することを忘れないでください。

DST を補正するためのコードがどのように見えるか正確には思い出せませんが、次のようなものだと思います: (オフセットを 2 つのオペランドに加算するか減算するかはよく覚えていません)

private static final long ONE_WEEK_MILLIS = 1000 * 60 * 60 * 24 * 7;

public int getWeeksBetween(Calendar calOne, Calendar calTwo) {
    long millisOne = calOne.getTime().getTime();
    long millisTwo = calTwo.getTime().getTime();
    long offsetOne = calOne.getTimeZone().getOffset(millisOne);
    long offsetTwo = calTwo.getTimeZone().getOffset(millisTwo);
    long diff = (millisTwo - offsetTwo) - (millisOne + offsetOne );
    return diff / ONE_WEEK_MILLIS;
}
于 2012-10-26T06:19:43.747 に答える
1

このための組み込み関数を見たことがなく、 likeCalendar.get(WEEK_OF_YEAR)またはJodaののみを呼び出しますLocalDate.getWeekOfWeekyear()java.util.Calendar(and Date) は、Joda Time のようなライブラリと比較して、悪いライブラリと見なされることがよくあります。この SO 投稿には、長所と短所の優れたリストがあります。

データベース テーブルが毎年繰り返し適用される場合、問題が発生する可能性があることに注意してください。一部の年 ( 400 あたり 71 年、または 5.6 あたり約 1年) は 53 週です。

上記を考えると、2 つの日付の間の日数を 7 で割った値 (すべて mod 52) を数えたり、毎年少しずれたり(weekOfYear(date) - weekOfYear(startDate)) % 52、暦年の初めの週。

于 2012-10-26T06:10:14.390 に答える