Java Data Type How to - Get next Martin Luther King Day with TemporalQuery








Question

We would like to know how to get next Martin Luther King Day with TemporalQuery.

Answer

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalQuery;
/*from   w w  w  . ja va2s  . com*/
public class Main {
  public static void main(String[] argv) {
    LocalDate date = LocalDate.parse("2013-01-12");
    TemporalQuery<LocalDate> quarterOfYearQuery = new NextMartinLutherKingDayQuery();

    System.out.println(date.query(quarterOfYearQuery));
  }
}

class NextMartinLutherKingDayQuery implements TemporalQuery<LocalDate> {
  @Override
  public LocalDate queryFrom(TemporalAccessor temporal) {
    LocalDate date = LocalDate.from(temporal);
    LocalDate currentYearMLKDay = getMartinLutherKingDayForDateInYear(date
        .getYear());

    Period periodToCurrentYearMLKDay = Period.between(date, currentYearMLKDay);

    if (periodToCurrentYearMLKDay.isNegative()
        || periodToCurrentYearMLKDay.isZero()) {
      return getMartinLutherKingDayForDateInYear(date.getYear() + 1);
    } else {
      return currentYearMLKDay;
    }
  }
  private LocalDate getMartinLutherKingDayForDateInYear(int year) {
    return LocalDate.of(year, Month.JANUARY, 1).with(
        TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.MONDAY));
  }

}

The code above generates the following result.