1. 概要

このチュートリアルでは、Java8のLocalDateインスタンスに日を追加しながら、週末をスキップするアルゴリズムについて簡単に説明します。

また、アルゴリズムを実行して、 週末をスキップしながら、LocalDateオブジェクトから日を減算します。

2. 日数の追加

このメソッドでは、必要な日数を追加するまで、LocalDateオブジェクトに1日を追加し続けます。 日を追加するときに、新しいLocalDateインスタンスの日が土曜日か日曜日かを確認します

チェックでtrueが返された場合、その時点までに追加された日数の間、カウンターはインクリメントされません。 ただし、当日が平日である場合は、カウンターをインクリメントします。

このようにして、カウンターが追加されることになっている日数と等しくなるまで、日数を追加し続けます。

public static LocalDate addDaysSkippingWeekends(LocalDate date, int days) {
    LocalDate result = date;
    int addedDays = 0;
    while (addedDays < days) {
        result = result.plusDays(1);
        if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
            ++addedDays;
        }
    }
    return result;
}

上記のコードでは、 LocalDateオブジェクトのplusDays()メソッドを使用して、resultオブジェクトに日を追加します。 addedDays 変数は、日が平日である場合にのみインクリメントします。 変数addedDaysdays変数と等しい場合、 result LocalDateオブジェクトへの1日の追加を停止します。

3. 日を引く

同様に、 minusDays()メソッドを使用して、必要な日数を減算するまで、LocalDateオブジェクトから日数を減算できます。

これを実現するために、減算された日数のカウンターを保持します。このカウンターは、結果の日が平日である場合にのみ増分されます

public static LocalDate subtractDaysSkippingWeekends(LocalDate date, int days) {
    LocalDate result = date;
    int subtractedDays = 0;
    while (subtractedDays < days) {
        result = result.minusDays(1);
        if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
            ++subtractedDays;
        }
    }
    return result;
}

上記の実装から、 extractDays は、 resultLocalDateオブジェクトが平日である場合にのみインクリメントされることがわかります。 whileループを使用して、extractDaysdays変数と等しくなるまで日数を減算します。

4. 結論

この短い記事では、週末をスキップしてLocalDateオブジェクトに日を加算および減算するためのアルゴリズムを見てきました。 さらに、Javaでのそれらの実装を調べました。

いつものように、実際の例の完全なソースコードは、GitHubから入手できます。