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

本文主要是介绍深入了解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-22LocalDate 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-07TemporalAdjuster 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-25TemporalAdjuster temporalAdjuster1 = TemporalAdjusters.nextOrSame(dayOfWeek);LocalDate localDate2 = LocalDate.of(2023, 11, 1);LocalDate localDate3 = localDate2.with(temporalAdjuster1);System.out.println(localDate3);//输出结果:2023-11-01
}

这篇关于深入了解Java8新特性-日期时间API之TemporalAdjusters与TemporalAdjuster的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440620

相关文章

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma