深入了解Java8新特性-日期时间API之TemporalAdjusters与TemporalAdjuster

阅读建议

嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概10000多字,预计阅读时间长需要10分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

注意

本文编写的单元测试是基于java11,具体的版本号是:11.0.19

TemporalAdjusters与TemporalAdjuster

TemporalAdjuster

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

@FunctionalInterface
public interface TemporalAdjuster {
    Temporal adjustInto(Temporal temporal);
}

TemporalAdjusters

TemporalAdjusters也是Java 8中处理日期时间的工具类,但它的功能和TemporalAdjuster有所不同。TemporalAdjusters是一个静态工具类,提供了很多静态方法来创建TemporalAdjuster对象,这些方法可以用于对日期时间进行一些常用的调整操作,例如获取本月的第一天、下个月的第一天、本年的第一天或最后一天等。这些方法返回的TemporalAdjuster对象可以用于对日期时间进行相应的调整操作。

功能作用

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

TemporalAdjusters的意义在于它为Java日期时间API注入了更多的活力,使其更加适应现代应用程序的需求。通过TemporalAdjusters,开发人员可以更方便地处理日期时间的各种操作,例如添加或减去一定的时间量、获取特定时间单位的值、将日期时间转换为不同的格式等等。此外,TemporalAdjusters还支持链式调用,使得对日期时间的操作更加流畅和直观。

使用场景分析

TemporalAdjusters的使用场景非常广泛,可以应用于各种需要调整日期时间的场景。以下是一些常见的使用场景:

  • 计算日期时间差值:TemporalAdjusters提供了一组方法,可以轻松地计算两个日期时间之间的差值,例如计算两个日期之间的天数、小时数或分钟数等。
  • 获取特定时间单位的值:使用TemporalAdjusters可以方便地获取日期时间的特定时间单位的值,例如获取当前日期的年份、月份、日期等。
  • 调整日期时间:TemporalAdjusters提供了一组方法,可以对日期时间进行调整,例如在日期上添加或减去一定的时间量、将日期时间转换为不同的格式等。
  • 解析日期时间字符串:TemporalAdjusters可以用于解析日期时间字符串,并将其转换为Temporal对象。这使得开发人员可以更方便地处理日期时间的字符串表示形式。
  • 时区转换:TemporalAdjusters提供了一些方法,可以将日期时间从一个时区转换为另一个时区。这对于国际化应用程序来说非常有用,可以方便地处理不同时区之间的日期时间转换。

核心方法

TemporalAdjusters#ofDateAdjuster(...)

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

@Test
public void test() {
    UnaryOperator<LocalDate> unaryOperator = item -> item.minusDays(1);//日期调节逻辑:减去1天
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.ofDateAdjuster(unaryOperator);//构造日期调节器类
    LocalDate localDate1 = LocalDate.of(2023, 11, 22);//日期:2023-11-22
    LocalDate localDate2 = localDate1.with(temporalAdjuster);//执行调节逻辑,并返回调节后结果
    System.out.println(localDate2);//输出结果:2023-11-21
}

TemporalAdjusters#firstDayOfMonth()

TemporalAdjusters.firstDayOfMonth()是一个静态方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为本月的第一天。

这个方法返回的 TemporalAdjuster 对象可以与任何实现了 java.time.temporal.Temporal 接口的对象一起使用,例如 LocalDate、LocalDateTime、ZonedDateTime 等。使用 with 方法将 TemporalAdjuster 应用于这些对象,可以对日期进行调整。

@Test
public void test1() {
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstDayOfMonth();
    LocalDateTime localDateTime = LocalDateTime.of(2023, 11, 12, 13, 1, 12);
    LocalDateTime localDateTime1 = localDateTime.with(temporalAdjuster);
    System.out.println(localDateTime1);//输出结果:2023-11-01T13:01:12
}

TemporalAdjusters#lastDayOfMonth()

TemporalAdjusters.lastDayOfMonth()是一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为本月的最后一天。这个方法返回的 TemporalAdjuster 对象可以与任何实现了 java.time.temporal.Temporal 接口的对象一起使用,例如 LocalDate、LocalDateTime、ZonedDateTime 等。使用 with 方法将 TemporalAdjuster 应用于这些对象,可以对日期进行调整。

@Test
public void test2() {
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.lastDayOfMonth();
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-02-28
}

TemporalAdjusters#firstDayOfNextMonth()

TemporalAdjusters.firstDayOfNextMonth() 是一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为下一个月的第一天。这个方法返回的 TemporalAdjuster 对象可以与任何实现了 java.time.temporal.Temporal 接口的对象一起使用,例如 LocalDate、LocalDateTime、ZonedDateTime 等。使用 with 方法将 TemporalAdjuster 应用于这些对象,可以对日期进行调整。

@Test
public void test3() {
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstDayOfNextMonth();
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-03-01
}

TemporalAdjusters#firstDayOfYear()

TemporalAdjusters.firstDayOfYear() 是一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为本年的第一天。这个方法返回的 TemporalAdjuster 对象可以与任何实现了 java.time.temporal.Temporal 接口的对象一起使用,例如 LocalDate、LocalDateTime、ZonedDateTime 等。使用 with 方法将 TemporalAdjuster 应用于这些对象,可以对日期进行调整。

@Test
public void test4() {
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstDayOfYear();
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-01-01
}

TemporalAdjusters#lastDayOfYear()

TemporalAdjusters.lastDayOfYear() 是 一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为本年的最后一天。这个方法返回的 TemporalAdjuster 对象可以与任何实现了 java.time.temporal.Temporal 接口的对象一起使用,例如 LocalDate、LocalDateTime、ZonedDateTime 等。使用 with 方法将 TemporalAdjuster 应用于这些对象,可以对日期进行调整。

@Test
public void test5() {
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.lastDayOfYear();
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-12-31
}

TemporalAdjusters#firstDayOfNextYear()

TemporalAdjusters.firstDayOfNextYear() 是一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为下一年度的第一天。这个方法返回的 TemporalAdjuster 对象可以与任何实现了 java.time.temporal.Temporal 接口的对象一起使用,例如 LocalDate、LocalDateTime、ZonedDateTime 等。使用 with 方法将 TemporalAdjuster 应用于这些对象,可以对日期进行调整。

@Test
public void test6() {
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstDayOfNextYear();
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2024-01-01
}

TemporalAdjusters#firstInMonth(...)

TemporalAdjusters.firstInMonth() 是 Java 8 中 java.time.temporal.TemporalAdjusters 类的一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为本月的第一个星期几。这个方法接受一个 DayOfWeek 类型的参数,用于指定要调整到的星期几。例如,如果想要将日期调整为当前日期月份的第一个星期二,可以这样使用:

@Test
public void test7() {
    DayOfWeek dayOfWeek = DayOfWeek.of(2);
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.firstInMonth(dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-02-07
}

TemporalAdjusters#lastInMonth(...)

TemporalAdjusters.lastInMonth() 是一个静态工厂方法,用于创建一个 TemporalAdjuster 对象,该对象可以用于将给定的日期调整为本月的最后一个星期几。这个方法接受一个 DayOfWeek 类型的参数,用于指定要调整到的星期几。例如,如果想要将日期调整为本月的最后一个星期二,可以这样使用:

@Test
public void test8() {
    DayOfWeek dayOfWeek = DayOfWeek.of(2);
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.lastInMonth(dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 2, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-02-28
}

TemporalAdjusters#dayOfWeekInMonth(...)

TemporalAdjusters.dayOfWeekInMonth() 是一个静态工厂方法,用于调整日期的静态方法。这个方法可以用来将给定的日期调整为指定月份中的指定星期几的日期。

这个方法接受两个参数:

  • ordinal - 一个整数,表示月份中的第几天。范围从 1(月份的第一天)到 28、29、30 或 31(根据月份和年份而定)。
  • dayOfWeek - 一个 DayOfWeek 枚举值,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。

使用这个方法,你可以将日期调整到指定月份的特定星期几。例如,如果你想将日期调整到 11 月的第一个星期三,你可以这样使用:

@Test
public void test9() {
    DayOfWeek dayOfWeek = DayOfWeek.of(3);
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.dayOfWeekInMonth(1, dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 11, 30);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-11-01
}

TemporalAdjusters#next(...)

TemporalAdjusters.next(DayOfWeek dayOfWeek) 是一个用于调整日期的静态方法,这个方法可以用来将给定的日期调整到下一个指定星期几。这个方法接受一个 DayOfWeek 参数,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。使用这个方法,你可以将日期调整到下一个特定星期几。例如,如果你想将日期调整到下一个星期日,你可以这样使用:

@Test
public void test10() {
    DayOfWeek dayOfWeek = DayOfWeek.SUNDAY;
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 12, 3);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-12-10
}

TemporalAdjusters#nextOrSame(...)

TemporalAdjusters.nextOrSame(DayOfWeek dayOfWeek) 是一个用于调整日期的静态方法,这个方法可以用来将给定的日期调整到下一个或相同的星期几。这个方法接受一个 DayOfWeek 参数,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。

TemporalAdjusters#nextOrSame(...)与TemporalAdjusters#next(...)区别在于:TemporalAdjusters.nextOrSame(DayOfWeek dayOfWeek) 方法将给定的日期调整到下一个或相同的星期几。这意味着,如果给定的日期已经是星期几,那么调整后的日期将与原始日期相同。否则,调整后的日期将是下一个星期几。TemporalAdjusters.next(DayOfWeek dayOfWeek) 方法将给定的日期调整到下一个星期几,不考虑原始日期是否已经是指定星期几。

假如当前日期是2023年11月30日星期四,返回下一周星期四的日期,使用TemporalAdjusters#nextOrSame(...),返回结果是2023-12-07;而使用TemporalAdjusters#nextOrSame(...)返回的则是其本身2023-11-30,除了这种特殊情况外,其余则是等同的。

@Test
public void test11() {
    DayOfWeek dayOfWeek = DayOfWeek.of(4);
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 11, 30);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-12-07
    TemporalAdjuster temporalAdjuster1 = TemporalAdjusters.nextOrSame(dayOfWeek);
    LocalDate localDate2 = LocalDate.of(2023, 11, 30);
    LocalDate localDate3 = localDate2.with(temporalAdjuster1);
    System.out.println(localDate3);//输出结果:2023-11-30
}

TemporalAdjusters#previous(...)

TemporalAdjusters.previous(DayOfWeek dayOfWeek) 是一个用于调整日期的静态方法,这个方法可以用来将给定的日期调整到上一个星期几。这个方法接受一个 DayOfWeek 参数,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。

使用这个方法,你可以将日期调整到上一个或同一天的特定星期几。例如,如果你想将日期调整到上一个周的星期三,你可以这样使用:

@Test
public void test12() {
    DayOfWeek dayOfWeek = DayOfWeek.of(3);
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.previous(dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 11, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-10-25
}

TemporalAdjusters#previousOrSame(...)

TemporalAdjusters#previousOrSame(DayOfWeek dayOfWeek) 是一个用于调整日期的静态方法,这个方法可以用来将给定的日期调整到上一个或相同的星期几。这个方法接受一个 DayOfWeek 参数,表示要调整到的星期几。例如,DayOfWeek.MONDAY 表示星期一。

TemporalAdjusters#previousOrSame(...)和TemporalAdjusters#previous(...)的区别,与上面的TemporalAdjusters#nextOrSame(...)与TemporalAdjusters#next(...)区别是类似的,不过是上面是下一周,这里是上一周。

使用这个方法,你可以将日期调整到上一个或同一天的特定星期几。例如,如果你想将日期调整到上一个或同一天的星期三,你可以这样使用:

@Test
public void test13() {
    DayOfWeek dayOfWeek = DayOfWeek.of(3);
    TemporalAdjuster temporalAdjuster = TemporalAdjusters.previous(dayOfWeek);
    LocalDate localDate = LocalDate.of(2023, 11, 1);
    LocalDate localDate1 = localDate.with(temporalAdjuster);
    System.out.println(localDate1);//输出结果:2023-10-25
    TemporalAdjuster temporalAdjuster1 = TemporalAdjusters.nextOrSame(dayOfWeek);
    LocalDate localDate2 = LocalDate.of(2023, 11, 1);
    LocalDate localDate3 = localDate2.with(temporalAdjuster1);
    System.out.println(localDate3);//输出结果:2023-11-01
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>