深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议

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

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

注意

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

ChronoUnit

ChronoUnit是Java 8中引入的一个枚举类,它定义了很多表示日期时间的枚举值,提供了基于单元的访问来操纵日期、时间或日期时间。ChronoUnit基于TemporalUnit接口实现,可以扩展标准单元集。这些单元适用于多个日历系统,例如大多数非ISO日历系统定义了年、月和日的单位,只是规则略有不同。每个单元的文档都说明了其运作方式。ChronoUnit是一个不可变的、线程安全的枚举,这意味着它适合在多线程环境中使用。

ChronoUnit的应用场景非常广泛,可以应用于各种需要处理和操纵日期时间的场景。以下是一些常见的应用场景:

  • 日期时间的格式化和解析:ChronoUnit可以用于将日期时间字符串格式化为特定的时间单位,例如将日期字符串转换为年、月、日等时间单位。同样,它也可以用于将日期时间字符串解析为日期时间对象,以便进一步处理。
  • 日期时间的加减运算:ChronoUnit提供了基于时间单位的加减运算方法,例如在日期上添加或减去一定的天数、月数或年数。这些方法可以帮助我们方便地进行日期时间的加减运算,用于计算日期时间的差异或者进行日期的推算。
  • 日历系统的转换:ChronoUnit适用于多个日历系统,因此可以用于不同日历系统之间的转换。例如,可以将基于ISO日历系统的日期时间转换为基于其他日历系统的日期时间,反之亦然。
  • 日期时间的查询和检索:ChronoUnit可以用于查询和检索日期时间的特定部分,例如获取当前日期的年份、月份、日期等。此外,它还可以用于查询和检索日期时间之间的间隔和关系,例如计算两个日期之间的天数差或者判断两个日期时间是否在同一年内。
  • 日期时间的格式化和可视化:ChronoUnit可以用于将日期时间格式化为特定的时间单位或者可视化呈现日期时间的结构。例如,可以将日期时间格式化为年、月、日或者小时、分钟、秒等不同的时间单位,或者将日期时间的各个部分以可视化的方式呈现出来。

实战示例

ChronoUnit.between() 是用于计算两个日期或时间之间的间隔。该方法接受两个 Temporal 类型的参数,并返回一个 long 类型的值,表示两个时间点之间的间隔。

java">@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 类型的值,表示要添加时间的日期或时间。
java">@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

ChronoFieldjava8提供的一个枚举类,里面定义了很多表示日历的字段,提供基于字段的访问来操纵日期,时间或日期时间。 可以通过实现TemporalField来扩展标准字段集。ChronoField类概要包目录:java.time.temporal类型:枚举类public enum ChronoField implements TemporalField一组标准字段。 这组字段提供基于字段的访问来操纵日期,时间或日期时间。 可以通过实现TemporalField来扩展标准字段集。 这些字段旨在适用于多个日历系统。例如,大多数非ISO日历系统将日期定义为年,月和日,只是略有不同的规则。 每个字段的文档说明了它的运作方式。 实现要求:这是一个最终的,不可变的和线程安全的枚举。 这表示在一周内将周数与年初对齐的天数的概念。

ChronoField的应用场景非常广泛,可以用于各种需要处理和操纵日期时间的场景。以下是一些常见的应用场景:

  • 日期时间的格式化和解析:ChronoField可以用于将日期时间字符串格式化为特定的时间单位,例如将日期字符串转换为年、月、日等时间单位。同样,它也可以用于将日期时间字符串解析为日期时间对象,以便进一步处理。
  • 日期时间的加减运算:ChronoField提供了基于时间单位的加减运算方法,例如在日期上添加或减去一定的天数、月数或年数。这些方法可以帮助我们方便地进行日期时间的加减运算,用于计算日期时间的差异或者进行日期的推算。
  • 日历系统的转换:ChronoField适用于多个日历系统,因此可以用于不同日历系统之间的转换。例如,可以将基于ISO日历系统的日期时间转换为基于其他日历系统的日期时间,反之亦然。
  • 日期时间的查询和检索:ChronoField可以用于查询和检索日期时间的特定部分,例如获取当前日期的年份、月份、日期等。此外,它还可以用于查询和检索日期时间之间的间隔和关系,例如计算两个日期之间的天数差或者判断两个日期时间是否在同一年内。
  • 日期时间的格式化和可视化:ChronoField可以用于将日期时间格式化为特定的时间单位或者可视化呈现日期时间的结构。例如,可以将日期时间格式化为年、月、日或者小时、分钟、秒等不同的时间单位,或者将日期时间的各个部分以可视化的方式呈现出来。

实战示例

java">@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);
}

ChronoUnitChronoField的区别

ChronoUnitChronoField都是Java 8中引入的与日期和时间相关的类,它们的功能和应用场景有所不同。

  • ChronoUnit是一个枚举类,它定义了很多表示时间单位的枚举值,例如年、月、日、小时、分钟、秒等。ChronoUnit基于TemporalUnit接口实现,可以扩展标准时间单位集。它适用于多个日历系统,因此可以用于不同日历系统之间的转换。ChronoUnit提供了基于时间单位的加减运算方法,可以用于计算日期时间的差异或者进行日期的推算。此外,ChronoUnit还可以用于格式化和解析日期时间字符串,以及进行日期时间的查询和检索等操作。
  • ChronoField是另一个枚举类,它定义了很多表示日历的字段,例如年、月、日、星期、季度、月份等。ChronoField实现了TemporalField接口,可以用于获取和设置日期时间的字段值,以及进行日期时间的加减运算等操作。与ChronoUnit不同的是,ChronoField适用于多个日历系统,而且它是不可变的、线程安全的枚举类。ChronoField可以用于将日期时间格式化为特定的时间单位或者可视化呈现日期时间的结构。此外,ChronoField还可以用于查询和检索日期时间的特定部分,例如获取当前日期的年份、月份、日期等。

总之,ChronoUnitChronoField都是用于处理日期和时间的类,但它们的功能和应用场景有所不同。ChronoUnit主要用于处理时间单位和进行时间运算,而ChronoField主要用于处理日历字段和进行日期时间的格式化、查询和检索等操作。


http://www.niftyadmin.cn/n/5229981.html

相关文章

易石无代码开发:电商平台连接CRM与客服系统,实现营销自动化

易石无代码开发的优势 易石软件以其强大的无代码开发平台,为电商企业提供了一种全新的业务集成手段。在激烈的市场竞争中,电商平台必须不断优化其运营效率和客户服务质量。易石无需复杂的API开发,通过简单的配置就能实现电商平台与CRM、客服…

产品学习之路(一)

在做好开发的同时,还需要熟悉产品业务逻辑,不能为了功能而做功能,要从产品经理的角度去看待每个需求和客户痛点所在,这样针对产品设计出来的东西自己也有发言权; 目前作为一名前端开发人员,也在自学产品知识…

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日,第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕,本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会(筹)主办&#xff0c…

冒泡排序(适合编程新手的体质)

冒泡排序:简单而高效的排序技巧 欢迎来到我们今天的博客,我们将一起探索计算机科学中最基本但同时也非常重要的概念之一:冒泡排序。无论你是编程新手还是有一些编程经验的读者,这篇博客都将帮助你更好地理解冒泡排序的原理和应用…

Kubernetes v1.28.4 安装笔记

安装 kubelet kubeadm kubectl K8s 集群的每个 node 上都要安装的 官方文档参考: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl 配置 containerd (容器运…

Vue学习笔记-命名路由

作用 简化路由的跳转,适合在路径过长的时候使用(例如:path:/a/b/c/d/e/f/...) 如何理解:相当于给路径起别名 使用方式 给路由命名 //创建一个路由器 const router new VueRouter({routes:[......{path:/home,component:HomeV…

Andrioid T 实现充电动画(2)

Andrioid T 实现充电动画(2) 以MTK平台为例,实现充电动画 效果图 资源包 修改文件清单 system/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/prize_charge_layout.xmlsystem/vendor/mediatek/proprietary/packages/ap…

ARM安全架构——为复杂软件提供保护

目录 一、概述 二、栈溢出和执行权限 三、面向返回的编程ROP 四、面向跳转的编程(JOP) 五、将这些技术应用于实际代码 七、检查你的知识