本文介绍: TemporalAdjusters与TemporalAdjuster作用在于提供了一种统一的、类型安全方式处理日期时间操作。在过去的版本中,Java日期时间API主要依赖于Calendar类,但这个类在处理复杂日期时间操作时显得不够灵活和类型安全。TemporalAdjusters出现弥补了这一缺陷,使得日期时间操作更加简洁、易用和类型安全。TemporalAdjusters的意义在于它为Java日期时间API注入了更多的活力,使其更加适应现代应用程序需求通过TemporalAdjust

阅读建议

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

  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#ofDateAdjuster(…)

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

@Test
public void test() {
    UnaryOperator<LocalDate&gt; unaryOperator = item -&gt; 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() 是一个静态工厂方法,用于调整日期的静态方法。这个方法可以用来将给定的日期调整为指定月份中的指定星期几的日期。

这个方法接受两个参数

  • 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
}

原文地址:https://blog.csdn.net/fox9916/article/details/134719297

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_35682.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注