Java如何使用TemporalAdjuster操作LocalDate对象?

在前面的示例中,我们LocalDate使用诸如plusMonths()或的方法通过按天,月,年对日期对象的值进行加或减来操纵的值minusDays()。或者使用类似withYear()或的方法更改日期对象的年或月withMonth()。

但是有些时候我们想要操纵日期对象,以便获得月的第一天或月的最后一天。我们要操纵日期值,以将日期提前到当天或当年最后一天之后的第一个星期一。

要以这种方式操作日期对象,我们可以使用with()方法并将TemporalAdjuster对象作为参数传递。幸运的是,日期和时间API已经提供了一些常用的TemporalAdjuster。这些TemporalAdjuster是作为静态工厂方法提供的,我们可以在java.time.temporal.TemporalAdjusters类中找到它们。

以下示例是使用TemporalAdjuster/TemporalAdjusters类操纵日期对象的代码段。

package org.nhooo.example.datetime;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

public class DateManipulationWithTemporalAdjuster {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        System.out.println("Current date       = " + date);

        LocalDate date1 = date.with(TemporalAdjusters.firstDayOfMonth());
        System.out.println("First day of month = " + date1);

        LocalDate date2 = date.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println("Last day of month  = " + date2);

        LocalDate date3 = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
        System.out.println("Next Monday        = " + date3);

        LocalDate date4 = date.with(TemporalAdjusters.lastDayOfYear());
        System.out.println("Last day of year   = " + date4);
    }
}

代码段的结果是:

Current date       = 2016-03-06
First day of month = 2016-03-01
Last day of month  = 2016-03-31
Next Monday        = 2016-03-07
Last day of year   = 2016-12-31

下表显示了TemporalAdjusters该类提供的静态工厂方法的完整信息。

方法名称方法说明
dayOfWeekInMonth返回与月份中的星期几相同的月份中的新日期。
firstDayOfMonth返回设置为当前月份第一天的新日期。
firstDayOfNextMonth返回设置为下个月第一天的新日期。
firstDayOfNextYear返回设置为明年第一天的新日期。
firstDayOfYear返回设置为当年第一天的新日期。
firstInMonth返回与第一个匹配的星期几相同的月份中的新日期。
lastDayOfMonth返回设置为当月最后一天的新日期。
lastDayOfYear返回设置为当年最后一天的新日期。
lastInMonth返回与上一个匹配的星期几相同的月份中的新日期。
next返回下一个星期几调节器。
nextOrSame返回下一个或相同的星期几调节器。
ofDateAdjuster返回用户编写的调节器。
previous返回上一个星期几调节器。
previousOrSame返回前一个或相同的星期几调节器。