Java TemporalAdjusters类的示例

时间:2020-01-09 10:35:17  来源:igfitidea点击:

java.time.temporal.TemporalAdjusters类是Java 8中添加的新日期和时间API的一部分,该API提供了常见且有用的TemporalAdjusters。 Java中的TemporalAdjusters类具有许多用于修改时间对象的静态方法,即用于调整日期和时间的方法。

我们必须了解两个接口Temporal和TemporalAdjuster才能了解时间对象的整个概念。

java.time.temporal.Temporal接口

时间的是框架级别的接口,它定义对时间对象(例如日期,时间,偏移量或者它们的某种组合)的读写访问。

这是日期,时间和偏移量对象的基本接口类型,这些对象足够完整,可以使用加号和减号进行操作,因此可以访问日期/时间/偏移量信息。

下面给出了实现Temporal接口的新日期和时间API中的一些类

  • Instant

  • LocalDate

  • LocalDateTime

  • LocalTime

  • OffsetDateTime

  • OffsetTime

  • ZonedDateTime

因此,这些类的对象属于Temporal类型,TemporalAdjusters类的静态方法可以修改这些临时对象。

java.time.temporal.TemporalAdjuster接口

TemporalAdjuster是一个功能接口,提供用于调整时间对象的策略。该接口具有单个抽象方法AdjustInto(),它可以调整指定的时间对象。

例如

temporal = thisAdjuster.adjustInto(temporal);

但是推荐的方法是使用temporal = temporal.with(thisAdjuster);方法,而不是直接使用adjustInto()方法。

java.time.temporal.TemporalAdjusters类

TemporalAdjusters类具有许多返回TemporalAdjuster的便捷方法。下面列出了一些方法

  • TemporalAdjuster dayOfWeekInMonth(int ordinal,DayOfWeek dayOfWeek)–返回月份中的星期几调节器,它返回一个新的日期以及基于月份的星期几。

  • TemporalAdjuster firstDayOfMonth()–返回"月份的第一天"调节器,该调节器返回设置为当前月份第一天的新日期。

  • TemporalAdjuster firstDayOfNextMonth()–返回"下个月的第一天"调节器,它返回设置为下个月第一天的新日期。

  • TemporalAdjuster firstDayOfYear()–返回"一年中的第一天"调节器,该调节器返回设置为当前年第一天的新日期。

  • TemporalAdjuster lastDayOfMonth()–返回"月的最后一天"调节器,该调节器返回设置为当前月最后一天的新日期。

  • TemporalAdjuster lastDayOfYear()–返回"一年中的最后一天"调节器,该调节器返回设置为当年最后一天的新日期。

Java TemporalAdjusters示例

1.查找LocalDateTime对象的每月的第一天或者最后一天。

LocalDateTime ldt = LocalDateTime.now();
System.out.println("Current date time- " + ldt);
System.out.println("First day of the month- " + ldt.with(TemporalAdjusters.firstDayOfMonth()));
System.out.println("Last day of the month - " + ldt.with(TemporalAdjusters.lastDayOfMonth()));

输出:

Current date time- 2019-11-20T10:39:26.583287900
First day of the month- 2019-11-01T10:39:26.583287900
Last day of the month – 2019-11-30T10:39:26.583287900

2.查找一个LocalDate对象在每月的星期几。在示例代码中,将计算给定月份的第一个星期日和上一个星期日。

LocalDate ld = LocalDate.now();
System.out.println("Current Date - " + ld);
System.out.println("First Sunday of the month - " + ld.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY)));
System.out.println("Previous Sunday - " + ld.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)));

输出:

Current Date - 2019-11-20
First Sunday of the month - 2019-11-03
Previous Sunday – 2019-11-17

自定义TemporalAdjuster示例

我们可以实现自己的TemporalAdjuster来满足特定要求。假设我们要获得该月的最后一个工作日。

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class WorkingDayAdjuster implements TemporalAdjuster {
  @Override
  public Temporal adjustInto(Temporal temporal) {
    LocalDateTime ldt = LocalDateTime.from(temporal);
    ldt = ldt.with(TemporalAdjusters.lastDayOfMonth());
    if(ldt.getDayOfWeek() == DayOfWeek.SATURDAY || ldt.getDayOfWeek() == DayOfWeek.SUNDAY) {
      ldt = ldt.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
    }
    return temporal.with(ldt);
  }
}
public class WorkingDay {
  public static void main(String[] args) {
    LocalDateTime ldt = LocalDateTime.now();
    System.out.println("Current Date - " + ldt);
    System.out.println("Last working day of the month - " + ldt.with(new WorkingDayAdjuster()));
  }
}

输出:

Current Date - 2019-11-20T11:10:48.365786300
Last working day of the month - 2019-11-29T11:10:48.365786300