阅读建议
嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:
- 本篇文章大概3000多字,预计阅读时间长需要5分钟。
- 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
- 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。
注意
本文编写的单元测试是基于java11,具体的版本号是:11.0.19
ChronoUnit
ChronoUnit是Java 8中引入的一个枚举类,它定义了很多表示日期时间的枚举值,提供了基于单元的访问来操纵日期、时间或日期时间。ChronoUnit基于TemporalUnit接口实现,可以扩展标准单元集。这些单元适用于多个日历系统,例如大多数非ISO日历系统定义了年、月和日的单位,只是规则略有不同。每个单元的文档都说明了其运作方式。ChronoUnit是一个不可变的、线程安全的枚举,这意味着它适合在多线程环境中使用。
ChronoUnit的应用场景非常广泛,可以应用于各种需要处理和操纵日期时间的场景。以下是一些常见的应用场景:
- 日期时间的格式化和解析:ChronoUnit可以用于将日期时间字符串格式化为特定的时间单位,例如将日期字符串转换为年、月、日等时间单位。同样,它也可以用于将日期时间字符串解析为日期时间对象,以便进一步处理。
- 日期时间的加减运算:ChronoUnit提供了基于时间单位的加减运算方法,例如在日期上添加或减去一定的天数、月数或年数。这些方法可以帮助我们方便地进行日期时间的加减运算,用于计算日期时间的差异或者进行日期的推算。
- 日历系统的转换:ChronoUnit适用于多个日历系统,因此可以用于不同日历系统之间的转换。例如,可以将基于ISO日历系统的日期时间转换为基于其他日历系统的日期时间,反之亦然。
- 日期时间的查询和检索:ChronoUnit可以用于查询和检索日期时间的特定部分,例如获取当前日期的年份、月份、日期等。此外,它还可以用于查询和检索日期时间之间的间隔和关系,例如计算两个日期之间的天数差或者判断两个日期时间是否在同一年内。
- 日期时间的格式化和可视化:ChronoUnit可以用于将日期时间格式化为特定的时间单位或者可视化呈现日期时间的结构。例如,可以将日期时间格式化为年、月、日或者小时、分钟、秒等不同的时间单位,或者将日期时间的各个部分以可视化的方式呈现出来。
实战示例
ChronoUnit.between() 是用于计算两个日期或时间之间的间隔。该方法接受两个 Temporal 类型的参数,并返回一个 long 类型的值,表示两个时间点之间的间隔。
@Test
public void test(){
LocalDate localDate = LocalDate.of(2022, 11, 26);
LocalDate localDate1 = LocalDate.of(2023, 11, 26);
long totalDays = ChronoUnit.DAYS.between(localDate, localDate1);
System.out.println(totalDays);//输出结果:365
}
ChronoUnit.addTo() 是一个方法,用于将指定的时间量添加到给定的日期或时间。它属于 java.time.temporal.ChronoUnit 类。
该方法接受两个参数:
- long 类型的值,表示要添加的时间量。
- Temporal 类型的值,表示要添加时间的日期或时间。
@Test
public void test() {
LocalDate localDate = LocalDate.of(2022, 11, 26);
LocalDate localDate1 = ChronoUnit.DAYS.addTo(localDate, 5);
System.out.println(localDate1);//输出结果:2022-12-01
}
ChronoField
ChronoField是java8提供的一个枚举类,里面定义了很多表示日历的字段,提供基于字段的访问来操纵日期,时间或日期时间。 可以通过实现TemporalField来扩展标准字段集。ChronoField类概要包目录:java.time.temporal类型:枚举类public enum ChronoField implements TemporalField一组标准字段。 这组字段提供基于字段的访问来操纵日期,时间或日期时间。 可以通过实现TemporalField来扩展标准字段集。 这些字段旨在适用于多个日历系统。例如,大多数非ISO日历系统将日期定义为年,月和日,只是略有不同的规则。 每个字段的文档说明了它的运作方式。 实现要求:这是一个最终的,不可变的和线程安全的枚举。 这表示在一周内将周数与年初对齐的天数的概念。
ChronoField的应用场景非常广泛,可以用于各种需要处理和操纵日期时间的场景。以下是一些常见的应用场景:
- 日期时间的格式化和解析:ChronoField可以用于将日期时间字符串格式化为特定的时间单位,例如将日期字符串转换为年、月、日等时间单位。同样,它也可以用于将日期时间字符串解析为日期时间对象,以便进一步处理。
- 日期时间的加减运算:ChronoField提供了基于时间单位的加减运算方法,例如在日期上添加或减去一定的天数、月数或年数。这些方法可以帮助我们方便地进行日期时间的加减运算,用于计算日期时间的差异或者进行日期的推算。
- 日历系统的转换:ChronoField适用于多个日历系统,因此可以用于不同日历系统之间的转换。例如,可以将基于ISO日历系统的日期时间转换为基于其他日历系统的日期时间,反之亦然。
- 日期时间的查询和检索:ChronoField可以用于查询和检索日期时间的特定部分,例如获取当前日期的年份、月份、日期等。此外,它还可以用于查询和检索日期时间之间的间隔和关系,例如计算两个日期之间的天数差或者判断两个日期时间是否在同一年内。
- 日期时间的格式化和可视化:ChronoField可以用于将日期时间格式化为特定的时间单位或者可视化呈现日期时间的结构。例如,可以将日期时间格式化为年、月、日或者小时、分钟、秒等不同的时间单位,或者将日期时间的各个部分以可视化的方式呈现出来。
实战示例
@Test
public void test6() {
LocalDate localDate = LocalDate.now();
int year = localDate.get(ChronoField.YEAR);//得到年份
int month = localDate.get(ChronoField.MONTH_OF_YEAR);//得到月份
int day = localDate.get(ChronoField.DAY_OF_MONTH);//得到当月中第几天
int weekOfMonth = localDate.get(ChronoField.ALIGNED_WEEK_OF_MONTH);//得到当月的第几周
System.out.println("year:" + year + ",month:" + month + ",day:" + day + ",weekOfMonth:" + weekOfMonth);
}
ChronoUnit与ChronoField的区别
ChronoUnit和ChronoField都是Java 8中引入的与日期和时间相关的类,它们的功能和应用场景有所不同。
- ChronoUnit是一个枚举类,它定义了很多表示时间单位的枚举值,例如年、月、日、小时、分钟、秒等。ChronoUnit基于TemporalUnit接口实现,可以扩展标准时间单位集。它适用于多个日历系统,因此可以用于不同日历系统之间的转换。ChronoUnit提供了基于时间单位的加减运算方法,可以用于计算日期时间的差异或者进行日期的推算。此外,ChronoUnit还可以用于格式化和解析日期时间字符串,以及进行日期时间的查询和检索等操作。
- ChronoField是另一个枚举类,它定义了很多表示日历的字段,例如年、月、日、星期、季度、月份等。ChronoField实现了TemporalField接口,可以用于获取和设置日期时间的字段值,以及进行日期时间的加减运算等操作。与ChronoUnit不同的是,ChronoField适用于多个日历系统,而且它是不可变的、线程安全的枚举类。ChronoField可以用于将日期时间格式化为特定的时间单位或者可视化呈现日期时间的结构。此外,ChronoField还可以用于查询和检索日期时间的特定部分,例如获取当前日期的年份、月份、日期等。
总之,ChronoUnit和ChronoField都是用于处理日期和时间的类,但它们的功能和应用场景有所不同。ChronoUnit主要用于处理时间单位和进行时间运算,而ChronoField主要用于处理日历字段和进行日期时间的格式化、查询和检索等操作。