聞こえないJavaエンジニアが適当に書き連ねていく

つらつらとメモしたり日頃の溜まっている想いを吐き出す場所です。

今更ながらJavaでプレミアムフライデーを求めるロジックを考えた

www.waenavi.com これを読んで、Javaだとどうやって書けばいいか考えてみた。

まず、Java8以降は日付は LocalDate を使うようなのでAPIを読む。

LocalDate (Java Platform SE 8)

月末日をまず求めて、その日が金曜日じゃなかったら1日ずつ遡って曜日をチェックしていけばいいかな、と思いながら last をキーワードにしてページ内を検索してみる。

result = localDate.with(JULY).with(lastDayOfMonth());

という一文が出てくる。 これはいったい?と思い、ちょっとページを上に動かすと with というメソッドの説明だった。

https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html#with-java.time.temporal.TemporalAdjuster-

説明文を読んでみると、

一般的な調整の選択は、TemporalAdjustersで指定します。

と書かれており、TemporalAdjusters へのリンクが貼られている。

TemporalAdjusters (Java Platform SE 8)

リンクをクリックして、どんなメソッドがあるのかなと眺めると

lastInMonth(DayOfWeek dayOfWeek) 一致する最後の曜日を持つ同じ月の新しい日付を返す、月の最終アジャスタを返します。

という今回の用途にバリバリ使えそうなメソッドの説明が載っている。

https://docs.oracle.com/javase/jp/8/docs/api/java/time/temporal/TemporalAdjusters.html#lastInMonth-java.time.DayOfWeek-

どうやらこれを使えば欲しいものが求められそう。

念のため、DayOfWeek へのリンクもクリックしてどんな定義があるのか眺めてみる。

DayOfWeek (Java Platform SE 8)

FRIDAY 「曜日」金曜日のシングルトン・インスタンス

という記述が確認出来たので、金曜日を求めるには FRIDAYという列挙型定数を使えばいいことが分かった。

あとはこれらを組み合わせてプログラムを書くだけである。

というわけで書いたのがこのプログラム。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.DayOfWeek;
import java.time.LocalDate;

import static java.time.temporal.TemporalAdjusters.lastInMonth;

public class LastFriday {

    private static final Logger logger = LoggerFactory.getLogger(LastFriday.class);

    public static void main(String... args) {

        var lastFriday = LocalDate.of(2017,2,24);
        logger.info(lastFriday.toString() + " " + lastFriday.getDayOfWeek());
        for(int i = 0; i < 99; i++) {
            lastFriday = lastFriday.plusMonths(1).with(lastInMonth(DayOfWeek.FRIDAY));
            logger.info(lastFriday.toString() + " " + lastFriday.getDayOfWeek());
        }

    }

}

まぁQiitaだと1年半ほど前に既に既出なんですけどね。

qiita.com

答えをすぐに検索するのではなく、JavaDocの中をどのようなキーワードで検索して書いたかの備忘録としてネットの片隅にメモしておく。