原文:http://zetcode.com/java/temporaladjusters/

Java TemporalAdjusters教程展示了如何使用TemporalAdjusters修改 Java 中的Temporal对象。

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

Java TemporalAdjusters

TemporalAdjusters用于修改时间对象。 他们允许查找星期,月份或年份的第一天或最后一天; 一周的第二天或下一天,依此类推。

Java TemporalAdjusters示例

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

JavaTemporalAdjustersEx.java

  1. package com.zetcode;
  2. import java.time.DayOfWeek;
  3. import java.time.LocalDate;
  4. import java.time.temporal.TemporalAdjusters;
  5. public class JavaTemporalAdjustersEx {
  6. public static void main(String[] args) {
  7. var localDate = LocalDate.now();
  8. System.out.printf("today: %s%n", localDate);
  9. var date1 = localDate.with(TemporalAdjusters.firstDayOfMonth());
  10. System.out.printf("first day of month: %s%n", date1);
  11. var date2 = localDate.with(TemporalAdjusters.lastDayOfMonth());
  12. System.out.printf("last day of month: %s%n", date2);
  13. var date3 = localDate.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
  14. System.out.printf("next Monday: %s%n", date3);
  15. var date4 = localDate.with(TemporalAdjusters.firstDayOfNextMonth());
  16. System.out.printf("first day of next month: %s%n", date4);
  17. var date5 = localDate.with(TemporalAdjusters.lastDayOfYear());
  18. System.out.printf("last day of year: %s%n", date5);
  19. var date6 = localDate.with(TemporalAdjusters.firstDayOfYear());
  20. System.out.printf("first day of year: %s%n", date6);
  21. var date7 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
  22. System.out.printf("last Sunday of month: %s%n", date7);
  23. }
  24. }

该示例介绍了七个时间调节器。

  1. var localDate = LocalDate.now();

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

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

使用firstDayOfMonth(),我们可以找到当月的第一天。

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

使用lastDayOfMonth(),我们可以找到该月的最后一天。

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

使用next()DayOfWeek.MONDAY,我们找到下一个星期一。

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

使用firstDayOfNextMonth(),我们可以找到下个月的第一天。

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

使用lastDayOfYear(),我们可以找到一年中的最后一天。

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

使用firstDayOfYear(),可以找到一年的第一天。

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

使用lastInMonth()DayOfWeek.SUNDAY,我们可以找到该月的最后一个星期日。

  1. today: 2018-12-03
  2. first day of month: 2018-12-01
  3. last day of month: 2018-12-31
  4. next monday: 2018-12-10
  5. first day of next month: 2019-01-01
  6. last day of year: 2018-12-31
  7. first day of year: 2018-01-01
  8. last Sunday of month: 2018-12-30

这是输出。

Java 自定义TemporalAdjuster

我们可以创建我们的自定义时间调整器。

JavaCustomTemporalAdjusterEx.java

  1. package com.zetcode;
  2. import java.time.LocalDate;
  3. import java.time.Period;
  4. import java.time.temporal.TemporalAdjuster;
  5. public class JavaCustomTemporalAdjusterEx {
  6. public static void main(String[] args) {
  7. var localDate = LocalDate.of(2018, 12, 3);
  8. TemporalAdjuster taj = t -> t.plus(Period.ofDays(14));
  9. var result = localDate.with(taj);
  10. System.out.printf("Adding 14 days to %s gives %s",
  11. localDate, result);
  12. }
  13. }

本示例使用LocalDate.of()创建日期。 它在日期上增加了 14 天并打印结果。

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

这是一个 lambda 表达式,它创建一个TemporalAdjuster,它向创建的日期对象增加 14 天。

  1. var result = localDate.with(taj);

我们得到结果。

  1. Adding 14 days to 2018-12-03 gives 2018-12-17

这是输出。

我们可以通过实现TemporalAdjuster接口来创建时间调整器。

JavaCustomTemporalAdjusterEx2.java

  1. package com.zetcode;
  2. import java.time.LocalDate;
  3. import java.time.temporal.ChronoField;
  4. import java.time.temporal.Temporal;
  5. import java.time.temporal.TemporalAdjuster;
  6. class NextChristmas implements TemporalAdjuster {
  7. @Override
  8. public Temporal adjustInto(Temporal temporal) {
  9. return temporal.with(ChronoField.MONTH_OF_YEAR, 12)
  10. .with(ChronoField.DAY_OF_MONTH, 25);
  11. }
  12. }
  13. public class JavaCustomTemporalAdjusterEx2 {
  14. public static void main(String[] args) {
  15. var now = LocalDate.now();
  16. System.out.println("Today: " + now);
  17. var xmas = now.with(new NextChristmas());
  18. System.out.println("Next XMas: " + xmas);
  19. }
  20. }

在示例中,自定义TemporalAdjuster计算下一个 XMas 的日期。

  1. @Override
  2. public Temporal adjustInto(Temporal temporal) {
  3. return temporal.with(ChronoField.MONTH_OF_YEAR, 12)
  4. .with(ChronoField.DAY_OF_MONTH, 25);
  5. }

我们实现了adjustInto()方法,该方法返回 XMa 的Temporal对象,调用该方法的日期应调整为该对象。

  1. Today: 2018-12-03
  2. Next XMas: 2018-12-25

这是输出。

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

您可能对以下相关教程感兴趣: Java 文件教程Java LocalTime教程Java 教程Java Unix 时间教程