专业的JAVA编程教程与资源

网站首页 > java教程 正文

日期时间API之TemporalAdjusters与TemporalAdjuster

temp10 2024-10-28 19:34:24 java教程 7 ℃ 0 评论

TemporalAdjusters与TemporalAdjuster的作用在于提供了一种统一的、类型安全的方式来处理日期时间的操作。在过去的版本中,Java的日期时间API主要依赖于Calendar类,但这个类在处理复杂的日期时间操作时显得不够灵活和类型安全。TemporalAdjusters的出现弥补了这一缺陷,使得日期时间操作更加简洁、易用和类型安全。

先记录一个Date与LocalDateTime的互转:

日期时间API之TemporalAdjusters与TemporalAdjuster

//正常的Date转LocalDateTime
LocalDateTime statusLocalDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
//LocalDateTime转LocalDate
LocalDate localDate = statusLocalDateTime.toLocalDate();

TemporalAdjuster

TemporalAdjuster是Java 8中引入的新的日期时间API的一部分,是一个函数式接口。它能够执行复杂的日期操作,例如:获取当月的最后一天、可以获得下一个星期日或者下一年的第一天等。TemporalAdjuster只有一个带Temporal对象参数的抽象方法adjustInto(),可以通过向其传递Temporal对象在其任何实现中调用它。在TemporalAdjusters类中有许多预定义的实现,例如LocalDate、LocalDateTime等。

TemporalAdjusters

TemporalAdjusters是Java 8中处理日期时间的静态工具类,提供了很多静态方法来创建TemporalAdjuster对象,这些方法可以用于对日期时间进行一些常用的调整操作。更准确来说,封装了一些TemporalAdjuster的操作信息。这些方法返回的TemporalAdjuster对象可以用于对日期时间进行相应的调整操作。

API测试

  • 自定义日期操作ofDateAdjuster

它接受一个函数作为参数,该函数接受一个日期时间对象并返回一个新的日期时间对象,表示对该日期时间对象进行某种调整后的结果。这个方法返回一个TemporalAdjuster对象,可以用于对日期时间对象进行相应的调整操作。通常情况下,这个方法用于创建自定义的TemporalAdjuster对象,以执行一些复杂的日期时间调整操作。

LocalDate nextYear = LocalDate.now().with(TemporalAdjusters.ofDateAdjuster(new UnaryOperator<LocalDate>() {
    @Override
    public LocalDate apply(LocalDate localDate) {
        return localDate.plusYears(1);
    }
}));
System.out.println(nextYear);
//2025-07-31
  • 获取当月的最后一天
LocalDate lastDayOfMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDayOfMonth);
//2024-07-31
  • 获取当月的第一天
LocalDate firstDayOfMonth = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
System.out.println(lastDayOfMonth);
//2024-07-01
  • 获取下个月的第一天
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println(localDate);
//2024-08-01
  • TemporalAdjusters#next(DayOfWeek dayOfWeek)

将给定的日期调整到下一个指定星期几。这个方法接受一个 DayOfWeek 参数,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。使用这个方法,你可以将日期调整到下一个特定星期几。

LocalDate localDate = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println(localDate);
//调整到这周五:2024-08-02
  • TemporalAdjusters#nextOrSame(DayOfWeek dayOfWeek)

与TemporalAdjusters#next(...)区别在于:TemporalAdjusters.nextOrSame(...) 方法将给定的日期调整到下一个星期几,但是若指定日期与当前日期相同的话,则返回当前日期。

举个例子:

//因为我指定了日期是周三,今天刚好是周三,所以直接返回了当前日期
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-07-31
//这个则返回了下一个星期三
LocalDate localDate = LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-08-07
  • TemporalAdjusters#previous(DayOfWeek dayOfWeek)

与TemporalAdjusters#next(...)相反,将给定的日期调整到上一个指定星期几。

LocalDate localDate = LocalDate.now().with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-07-24
  • TemporalAdjusters#previousOrSame(DayOfWeek dayOfWeek)

与TemporalAdjusters.nextOrSame(...) 相反,将给定的日期调整到上一个星期几,但是若指定日期与当前日期相同的话,则返回当前日期。

LocalDate localDate = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.WEDNESDAY));
System.out.println(localDate);
//2024-07-31

在TemporalAdjusters中还有很多静态的方法,这里就不再一一举例了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表