This example finds out coming labor day date for the provided local date. It uses a custom TemporalQuery.
package com.logicbig.example.localdate;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalQuery;
public class QueryExample2 {
public static void main (String... args) {
LocalDate d = LocalDate.of(2017, 9, 1);
LocalDate nextLaborDay = d.query(LaborDayQuery);
System.out.println(nextLaborDay);
d = LocalDate.of(2017, 9, 4);
nextLaborDay = d.query(LaborDayQuery);
System.out.println(nextLaborDay);
d = LocalDate.of(2017, 9, 5);
nextLaborDay = d.query(LaborDayQuery);
System.out.println(nextLaborDay);
}
private static final TemporalQuery<LocalDate> LaborDayQuery =
new TemporalQuery<LocalDate>() {
private LocalDate getFirstMondayOfSeptember (LocalDate d) {
LocalDate september = d.withMonth(Month.SEPTEMBER
.getValue());
return september.with(TemporalAdjusters.firstInMonth(
DayOfWeek.MONDAY));
}
@Override
public LocalDate queryFrom (TemporalAccessor temporal) {
LocalDate d = LocalDate.from(temporal);
LocalDate d2 = getFirstMondayOfSeptember(d);
if (d.isAfter(d2)) {
d2 = getFirstMondayOfSeptember(d2.plusYears(1));
}
return d2;
}
};
}
Output
2017-09-04
2017-09-04
2018-09-03