Java如何创建自定义的TemporalAdjuster?

在此示例中,我们将学习如何实现自定义TemporalAdjuster。我们将创建TemporalAdjuster一个从指定日期开始的下一个工作日。从星期一到星期五,我们将使用5个工作日。

定制的时间调节器类应该实现TemporalAdjuster接口,该接口定义了我们必须实现的单个adjustInto(Temporal)方法。

package org.nhooo.example.datetime;

import java.time.DayOfWeek;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;

public class NextWorkingDayAdjuster implements TemporalAdjuster {
    @Override
    public Temporal adjustInto(Temporal temporal) {
        int field = temporal.get(ChronoField.DAY_OF_WEEK);
        DayOfWeek dayOfWeek = DayOfWeek.of(field);

        int daysToAdd = 1;
        if (DayOfWeek.FRIDAY.equals(dayOfWeek)) {
            daysToAdd = 3;
        } else if (DayOfWeek.SATURDAY.equals(dayOfWeek)) {
            daysToAdd = 2;
        }
        return temporal.plus(daysToAdd, ChronoUnit.DAYS);
    }
}

该NextWorkingDayAdjuster移动暂时物件每天前进。除了在星期五或星期六,这将分别将时间对象向前移动三天或两天。这将使其在下一个工作日返回星期一。

创建自定义调整器之后,现在让我们创建一个使用NextWorkingDayAdjuster该类的示例。

package org.nhooo.example.datetime;

import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.TemporalAdjuster;

public class NextWorkingDayAdjusterDemo {
    public static void main(String[] args) {
        TemporalAdjuster nextWorkingDay = new NextWorkingDayAdjuster();

        LocalDate now = LocalDate.now();
        LocalDate nextDay = now.with(nextWorkingDay);
        System.out.println("now            = " + now);
        System.out.println("nextWorkingDay = " + nextDay);

        LocalDate friday = LocalDate.of(2016, Month.MARCH, 11);
        nextDay = friday.with(nextWorkingDay);
        System.out.println("friday         = " + friday);
        System.out.println("nextWorkingDay = " + nextDay);

        LocalDate saturday = LocalDate.of(2016, Month.MARCH, 12);
        nextDay = saturday.with(nextWorkingDay);
        System.out.println("saturday       = " + saturday);
        System.out.println("nextWorkingDay = " + nextDay);
    }
}

这是我们的代码的结果:

now            = 2016-03-10
nextWorkingDay = 2016-03-11
friday         = 2016-03-11
nextWorkingDay = 2016-03-14
saturday       = 2016-03-12
nextWorkingDay = 2016-03-14