ZetCode

Java TemporalAdjusters

最后修改日期:2024 年 7 月 10 日

在本文中,我们将展示如何在 Java 中使用 TemporalAdjusters 修改 Temporal 对象。

Temporal 是日期、时间和偏移量对象的基础接口类型,包括 LocalDateLocalTimeLocalDateTimeInstant

TemporalAdjusters 用于修改 temporal 对象。 它们允许查找一周、一个月或一年的第一天或最后一天; 下一个或上一个工作日等等。

TemporalAdjusters 示例

以下示例使用内置的 TemporalAdjusters 方法。

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

void main() {

    var localDate = LocalDate.now();
    System.out.printf("today: %s%n", localDate);

    var date1 = localDate.with(TemporalAdjusters.firstDayOfMonth());
    System.out.printf("first day of month: %s%n", date1);

    var date2 = localDate.with(TemporalAdjusters.lastDayOfMonth());
    System.out.printf("last day of month: %s%n", date2);

    var date3 = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
    System.out.printf("next Monday: %s%n", date3);

    var date4 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
    System.out.printf("first day of next month: %s%n", date4);

    var date5 = localDate.with(TemporalAdjusters.lastDayOfYear());
    System.out.printf("last day of year: %s%n", date5);

    var date6 = localDate.with(TemporalAdjusters.firstDayOfYear());
    System.out.printf("first day of year: %s%n", date6);

    var date7 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
    System.out.printf("last Sunday of month: %s%n", date7);
}

该示例展示了七个 temporal adjusters。

var localDate = LocalDate.now();

我们使用 LocalDate.now 计算当前本地日期。

var date1 = localDate.with(TemporalAdjusters.firstDayOfMonth());

使用 firstDayOfMonth 我们找到该月的第一天。

var date2 = localDate.with(TemporalAdjusters.lastDayOfMonth());

使用 lastDayOfMonth 我们找到该月的最后一天。

var date3 = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));

使用 nextDayOfWeek.MONDAY 我们找到下个星期一。

var date4 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());

使用 firstDayOfNextMonth 我们找到下个月的第一天。

var date5 = localDate.with(TemporalAdjusters.lastDayOfYear());

使用 lastDayOfYear 我们找到今年的最后一天。

var date6 = localDate.with(TemporalAdjusters.firstDayOfYear());

使用 firstDayOfYear 我们找到今年的第一天。

var date7 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));

使用 lastInMonthDayOfWeek.SUNDAY 我们找到该月的最后一个星期日。

$ java Main.java
today: 2024-07-10
first day of month: 2024-07-01
last day of month: 2024-07-31
next Monday: 2024-07-15
first day of next month: 2024-08-01
last day of year: 2024-12-31
first day of year: 2024-01-01
last Sunday of month: 2024-07-28

自定义 TemporalAdjuster

我们可以创建自定义的 temporal adjusters。

Main.java
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.TemporalAdjuster;

void main() {

    var localDate = LocalDate.of(2024, 7, 10);

    TemporalAdjuster taj = t -> t.plus(Period.ofDays(14));
    var result = localDate.with(taj);

    System.out.printf("Adding 14 days to %s gives %s", 
        localDate, result);
}

该示例使用 LocalDate.of 创建一个日期。 它将日期加上十四天并打印结果。

TemporalAdjuster taj = t -> t.plus(Period.ofDays(14));

这是一个 lambda 表达式,它创建了一个 TemporalAdjuster,该表达式将创建的日期对象加上十四天。

var result = localDate.with(taj);

我们得到结果。

$ java Main.java
Adding 14 days to 2024-07-10 gives 2024-07-24

我们可以通过实现 TemporalAdjuster 接口来创建一个 temporal adjuster。

Main.java
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;

class NextChristmas implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {

        return temporal.with(ChronoField.MONTH_OF_YEAR, 12)
                .with(ChronoField.DAY_OF_MONTH, 25);

    }
}

void main() {

    var now = LocalDate.now();
    System.out.println("Today: " + now);

    var xmas = now.with(new NextChristmas());
    System.out.println("Next XMas: " + xmas);
}

在该示例中,自定义的 TemporalAdjuster 计算下一个圣诞节的日期。

@Override
public Temporal adjustInto(Temporal temporal) {

    return temporal.with(ChronoField.MONTH_OF_YEAR, 12)
            .with(ChronoField.DAY_OF_MONTH, 25);
}

我们实现了 adjustInto 方法,该方法返回圣诞节的 Temporal 对象,调用该方法的日期应调整到该圣诞节。

$ java Main.java
Today: 2024-07-10
Next XMas: 2024-12-25

来源

Java TemporalAdjuster - 语言参考

在本文中,我们使用 Java TemporalAdjusters 完成了日期和时间的修改。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程