3

たとえば、週の開始日と終了日を取得したい

2012-05-06 から 2012-05-12
2012-05-13 から 2012-05-19

私が書いたコードは

currWeekCalender.add(Calendar.WEEK_OF_YEAR, 1);

    String dateStart =  currWeekCalender.get(Calendar.YEAR) + "-" + addZero((currWeekCalender.get(Calendar.MONTH) + 1)) + "-" + addZero(currWeekCalender.getFirstDayOfWeek());
    currWeekCalender.add(Calendar.DAY_OF_MONTH,7);
    String dateEnd =  currWeekCalender.get(Calendar.YEAR) + "-" + addZero((currWeekCalender.get(Calendar.MONTH) + 1)) + "-" + addZero(currWeekCalender.get(Calendar.DAY_OF_MONTH));

しかし、結果は正しくありません。また、前の週の日付が必要です。

ありがとう

4

3 に答える 3

4

すべてのコーダーにこんにちは:)

データベースからいくつかのデータを取得するための小さなアプリに取り組んでいます。前週の開始日と終了日を計算するには、次のコードを使用します。

// Calendar object
Calendar cal = Calendar.getInstance();

// "move" cal to monday this week (i understand it this way)
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);

// calculate monday week ago (moves cal 7 days back)
cal.add(Calendar.DATE, -7);
Date firstDateOfPreviousWeek = cal.getTime();

// calculate sunday last week (moves cal 6 days fwd)
cal.add(Calendar.DATE, 6);
Date lastDateOfPreviousWeek = cal.getTime();

うまくいけば、それは役に立ちます。

于 2014-10-24T08:08:07.717 に答える
2

あなたの問題はgetFirstDayOfWeek()、週の最初の曜日を返すことです。たとえば、米国では日曜日、フランスでは月曜日です。月の日は返されません。javadocを参照してください。

週の始まりである月の最初の日は (疑似コードで)

((7 + (firstDayOfWeek - dayOfWeek(firstOfMonth))) % 7) + 1

必要に応じてコードに変換できjava.util.Calendarますが、代わりに Joda 時間を使用することをお勧めします。


また、前の週の日付が必要です。

おそらく使用して7日を差し引くだけですadd

currCalendar.add(Calendar.DAY_OF_MONTH, -7)

これにはアンダーフローが含まれる場合がありますが、それaddを処理します。

add(f, delta)

フィールド f にデルタを追加します。これはset(f, get(f) + delta)、次の 2 つの調整を使用して呼び出すことと同じです。

ルール 1 を追加します。呼び出し後のフィールド f の値から呼び出し前のフィールド f の値を差し引いた値が、フィールド f で発生したオーバーフローを法としてデルタになります。フィールド値がその範囲を超えるとオーバーフローが発生し、その結果、次に大きいフィールドが増分または減分され、フィールド値がその範囲に戻されます。

于 2012-05-05T20:11:30.053 に答える
1

Java 8 バージョン

これは過去 10 週間を出力します

final ZonedDateTime input = ZonedDateTime.now();

for(int i = 1; i < 10; i++) {
    final ZonedDateTime startOfLastWeek = input.minusWeeks(i).with(DayOfWeek.MONDAY);
    System.out.print(startOfLastWeek.format(DateTimeFormatter.ISO_LOCAL_DATE));
    final ZonedDateTime endOfLastWeek = startOfLastWeek.plusDays(6);
    System.out.println(" - " + endOfLastWeek.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
于 2016-01-04T15:26:31.043 に答える