2

私は簡単な問題に遭遇し、それを解決しました (あきらめませんでした)。ただし、もっときちんとしたトリッキーな解決策があると思います。問題は次のとおりです。今日の最後の X 日前の日付を返します。たとえば、今日が 2013 年 7 月 9 日火曜日で、最後の金曜日が必要な場合、答えは 2013 年 7 月 5 日金曜日になります。

私の解決策は次のとおりです。

    public Date dateOfLast(int day) {

        int today = calendar.get(Calendar.DAY_OF_WEEK);

        int daysDifferences = today - day;

        int daysToSubtract;

        if (day < today) {
            //last day seems to be in current week !
            //for example Fr > Tu.
            daysToSubtract = -(Math.abs(daysDifferences));
        } else {
            //7- ( difference between days )!
            //last day seems to be in the previous,thus we subtract the the days differences from 7
            // and subtract the result from days of month.
            daysToSubtract = -(7 - Math.abs(daysDifferences));
        }
        //subtract from days of month.
        calendar.add(Calendar.DAY_OF_MONTH, daysToSubtract);
        return calendar.getTime();
    }

もしあれば、誰かが私に数式またはより簡単な解決策を教えてくれますか?

4

2 に答える 2

2
int daysToSubtract = ((today - day) + 7) % 7;

私が間違っていなければ、OKのはずです。

例えば

today = 4
day = 2
daysToSubtract = ((4 - 2) + 7) % 7 = 2 : correct

today = 2
day = 4
daysToSubtract = ((2 - 4) + 7) % 7 = 5 : correct
于 2013-07-09T22:39:16.580 に答える
1

あなたの解決策は私には良さそうです。ただし、ヒント: ここで使用する必要はありません。ステートメントの各ブランチでMath.abs変数 (todayまたは) のどちらdayが大きいかを知っておく必要があります。if

if (day < today)
    daysToSubtract = day - today;  // 'today' is bigger
else
    daysToSubtract = day - today - 7;  // 'day' is bigger

あるいは単に

int daysToSubtract = day - today - ((day < today) ? 0 : 7);

daysDifferences変数はもう必要ないことに注意してください。

于 2013-07-09T22:39:30.173 に答える