前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java基础学习|学JDK8中的时间类LocalDateTime

Java基础学习|学JDK8中的时间类LocalDateTime

原创
作者头像
六月暴雪飞梨花
发布于 2023-12-30 11:06:39
发布于 2023-12-30 11:06:39
22800
代码可运行
举报
运行总次数:0
代码可运行

背景

Java里的日期和时间格式化问题,在JDK8(Java SE Development Kit8,以下使用过程中,均称为JDK1.8或者JDK8)以前有很多问题,例如日期类并不提供国际化,没有时区支持,包分配的也比较混乱。所以在JDK8后进行了大改造,索性在rt.jar中新增了一个time包,这样我们就可以个性化设置日期时间的展示方式了。

目前JDK已经到达了JDK 21(Java Development Kit 21),但是在主流的市场上面,使用JDK8的居多。我们现在已经掌握了不少关于日期和时间的操作技巧,但其实随着时间的不断推移,现实的需求也在不断更新,原先的一些API已经难以满足开发需求了。所以从JDK 8之后,为了满足更多的开发需求,Java给我们增加了不少关于日期时间的新特性,接下来本篇文章就带各位来看看这些新特性有哪些。

其他的就不在介绍那么多了,相关的介绍可以参考上两篇文章:LocalDate和LocalTime的详细剖析以及用法都进行了实践,而将LocalDateTime放在最后是因为,他在某些层面上是将上述两个进行了合体以及变相衍生了一些使用方法,所以熟悉上述两个用法后,再来看最后一个类的用法,就很轻松理解。其实三个日期、时间类都是在一起:LocalDate、LocalTime、LocalDateTime,主要是需要先了解前两个,但是我们在实际使用过程中,LocalDate和LocalDateTime却是使用频率最高,也是最长使用的两个类。

类在JDK包的位置

Time API是一组对日期和时间的最重要方面进行建模的包。java. time包中的核心类使用ISO-8601中定义的日历系统(基于公历系统)作为默认日历。当我们引入JDK8后,可以在rt.jar中的java.time目录下找到对应的基础API,打开可以看到有很多新引入的包和类。功能虽多,但是常用的也就是那么几个,所以你想要尽快熟悉,可以自行点击进去查阅,这也是每次写这里都要将这个拿出来,希望大家可以多点击下源码,你会收到不一样的开心。

LocalDateTime架构关系

LocalDateTime是一个最种类,他实现了很多类的接口。实现类有Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable。

单一来看,可能看不出来区别,我们将上两篇文章放在一起看,LocalDateLocalTimeLocalDateTime分别实现的类如下:

  • LocalTime

Temporal, TemporalAdjuster, Comparable<LocalTime>, Serializable。

  • LocalDate

Temporal, TemporalAdjuster, ChronoLocalDate, Serializable。

  • LocalDateTime

Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable。

从中我们看出来,Temporal, TemporalAdjuster,Serializable是共同实现的接口,我们只需要将不同点讲清楚就可以了。

LocalDateTime时间类实践

1 LocalDateTime自带功能

(1)now()创建日期方法

LocalDateTime在创建日期的时候可以说包含了LocalTime和LocalDate,其中囊括的有年、月、日、时、分、秒、毫秒。

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void main(String[] args) {
        System.out.println("-- LocalDateTime自带API功能");
        // 当前日期
        System.out.println("LocalDateTime.now() = " + LocalDateTime.now());
        // 衍生出来两个方法,其中一个是从时区获取当前日期,另外一个是从从时钟方式获取
        System.out.println("LocalDateTime.now(ZoneId.of('Asia/Shanghai')) = " + LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
        System.out.println("LocalDateTime.now(Clock.systemDefaultZone()) = " + LocalDateTime.now(Clock.systemDefaultZone()));
		}

测试结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- LocalDateTime自带API功能
LocalDateTime.now() = 2023-12-30T17:07:43.519
LocalDateTime.now(ZoneId.of('Asia/Shanghai')) = 2023-12-30T17:07:43.519
LocalDateTime.now(Clock.systemDefaultZone()) = 2023-12-30T17:07:43.519

(2)ofXXX()格式化创建日期方法

在LocalDateTime类中,有如下几个方法,都是根据不同条件来创建一个时间。

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  	public static void main(String[] args) {
 				// of函数,基础的设定,此处只举例一个
        System.out.println("LocalDateTime.of(2023, 12, 30, 18,26, 34 ) = " + LocalDateTime.of(2023, 12, 30, 18,26, 34 ));
        // of函数,获取一个设定日期,此方法感觉是一个欠揍的方法,但是作为API又不得不存在,他是集成了LocalDate、LocalTime。
        System.out.println("LocalDateTime.of(LocalDate.now(), LocalTime.now() = " + LocalDateTime.of(LocalDate.now(), LocalTime.now()));
        // ofXXX函数
        System.out.println("LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()) = " + LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()));
		}

测试结果如下:

LocalDateTime of(LocalDate date, LocalTime time)获取一个设定日期,此方法感觉是一个欠揍的方法,但是作为API又不得不存在,他是集成了LocalDate和LocalTime。所以提前学习好这里函数,到了LocalDateTime这里就比较好好操作,熟练后就是闭着眼睛也能写出可以跑的代码。

(3)parse转换时间方法

时间转换,同其他函数一样,这里有两个构造,此处只演示一个案例,另外一个还希望多操作实践下。

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 转换时间
System.out.println("LocalDateTime.parse(\"2023-12-30T18:26:34\") = " + LocalDateTime.parse("2023-12-30T18:26:34"));

测试结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDateTime.parse("2023-12-30T18:26:34") = 2023-12-30T18:26:34

注意⚠️:如果你看过前面的文章,可能会发现,在LocalDateTime类中没有提及LocalDate 类中的ofYearDay()方法,也没有提及到LocalTime 类ofNanoOfDay()方法和ofSecondOfDay()方法。如果你知道答案,还望能在评论区说说你的想法。

2 LocalDateTime继承、重写功能

在LocalDateTime中如同LocalDate和LocalTime一样,也有很多继承和重写的方法。

(1)获取字段方法

这里获取的字段其实就是我们在上面的年、月、日、时、分、秒、毫秒、纳秒以及一些常用的本年第几日、本月底几日、本周第几日等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// getDayOfXXX函数,获取当前日期的星期(英文)、当前日期所在月份中的第几天、当前日期所在年份中的第几天
System.out.println("LocalDateTime.now().getDayOfWeek() = " + LocalDateTime.now().getDayOfWeek());
System.out.println("LocalDateTime.now().getDayOfMonth() = " + LocalDateTime.now().getDayOfMonth());
System.out.println("LocalDateTime.now().getDayOfYear() = " + LocalDateTime.now().getDayOfYear());

测试打印结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDateTime.now().getDayOfWeek() = SATURDAY
LocalDateTime.now().getDayOfMonth() = 30
LocalDateTime.now().getDayOfYear() = 364

(2)withXXX()方法

LocalDateTime中的withXXX方法涵盖了LocalDate和LocalTime中的withXXX方法。

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// withXXX函数
// 返回当前月、周、年的星期几。例如返回当前月的第一天、返回本周的星期二、星期三的时间
System.out.println("LocalDateTime.now().with(LocalDate.now())) = " + LocalDateTime.now().with(LocalDate.now()));
System.out.println("LocalDateTime.now().with(ChronoField.DAY_OF_MONTH, 1)) = " + LocalDateTime.now().with(ChronoField.DAY_OF_MONTH, 1));
System.out.println("LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 2) = " + LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 2));
System.out.println("LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 3) = " + LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 3));
// 主要是月份的设置,例如设置10月份,当前时间的10号,当前时间的6点,那么就返回当前日期的副本且只修改数据。
System.out.println("LocalDateTime.now().withMonth(10) = " + LocalDateTime.now().withMonth(10));
System.out.println("LocalDateTime.now().withDayOfMonth(10)) = " + LocalDateTime.now().withDayOfMonth(10));
System.out.println("LocalDateTime.now().withHour(6)) = " + LocalDateTime.now().withHour(6));

测试结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDateTime.now().with(LocalDate.now())) = 2023-12-30T18:06:51.464
LocalDateTime.now().with(ChronoField.DAY_OF_MONTH, 1)) = 2023-12-01T18:06:51.464
LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 2) = 2023-12-26T18:06:51.464
LocalDateTime.now().with(ChronoField.DAY_OF_WEEK, 3) = 2023-12-27T18:06:51.465
LocalDateTime.now().withMonth(10) = 2023-10-30T18:06:51.465
LocalDateTime.now().withDayOfMonth(10)) = 2023-12-10T18:06:51.465
LocalDateTime.now().withHour(6)) = 2023-12-30T06:06:51.465

(3)isXXX()判断方法

LocalDateTime中的判断方法主要有

  • 在某个之前
  • 在某个时间之后
  • 是否等于
  • 是否在有效范围内/JDK设定的范围是否符合

咿呀,感觉是否又少了一个判断是否是闰年?哦,这个只在LocalDate中存在,在LocalDateTime和LocalTime并不存在。此时,我们从另外一个方面看待这个问题,其实就比较好理解了。

闰年,只是在日期中存在,在时间这个概念上面不存在;LocalDateTime兼容的度最小颗粒是时间,所以LocalDateTime和LocalTime是时间类,而LocalDate是日期类。所以在LocalDateTime中是没有闰年的判断的。有些时间我们也常常说,LocalDateTime为长时间,而LocalTime短时间也是这个道理。

(4)plusXXX()/minusXXX()方法

在LocalDateTime中,加法和减法是相互呼应的。可以参考表情的方法或者JDK中的方法进行参数设定,即可以使用。

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 日期加减,主要有两种类型:第一种是直接进行加减、使用TemporalAmount参数设定;第二种就是直接设定具体的参数
// 方式一 在当前日期增加3个周期,周期单位为天
System.out.println("LocalDateTime.now().plus(Period.ofDays(3)) = " + LocalDateTime.now().plus(Period.ofDays(3)));
// 方式二 在当前日期增加4天,在当前日期减少2周
System.out.println("LocalDateTime.now().plusDays(3) = " + LocalDateTime.now().plusDays(4));
System.out.println("LocalDateTime.now().minusWeeks(2) = " + LocalDateTime.now().minusWeeks(2));

测试结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LocalDateTime.now().plus(Period.ofDays(3)) = 2024-01-02T18:06:51.466
LocalDateTime.now().plusDays(3) = 2024-01-03T18:06:51.466
LocalDateTime.now().minusWeeks(2) = 2023-12-16T18:06:51.466

总结

在JDK8之前我们都是使用Date或者Calendar来做计算或者转换,自从有了JDK8,我们的CVX速度很明显增强了。JDK8引入了许多新的特性和改进,使得代码编写更加简洁、可读性更高,并且提供了更好的性能和并发处理能力。


我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基础学习|学JDK8中的时间类LocalTime
Java里的日期和时间格式化问题,在JDK8(Java SE Development Kit8,以下使用过程中,均称为JDK1.8或者JDK8)以前有很多问题,例如日期类并不提供国际化,没有时区支持,包分配的也比较混乱。所以在JDK8后进行了大改造,索性在rt.jar中新增了一个time包,这样我们就可以个性化设置日期时间的展示方式了。
六月暴雪飞梨花
2023/11/19
3010
Java基础学习|学JDK8中的时间类LocalTime
技术经验|Java基础之LocalDate类
Java里的日期和时间格式化问题,在JDK8(Java SE Development Kit8,以下使用过程中,均称为JDK1.8或者JDK8)以前有很多问题,例如日期类并不提供国际化,没有时区支持,包分配的也比较混乱。所以在JDK8后进行了大改造,索性在rt.jar中新增了一个time包,这样我们就可以个性化设置日期时间的展示方式了。
艾特
2023/12/29
1730
技术经验|Java基础之LocalDate类
技术经验|Java基础之LocalDate类
Java里的日期和时间格式化问题,在JDK8(Java SE Development Kit8,以下使用过程中,均称为JDK1.8或者JDK8)以前有很多问题,例如日期类并不提供国际化,没有时区支持,包分配的也比较混乱。所以在JDK8后进行了大改造,索性在rt.jar中新增了一个time包,这样我们就可以个性化设置日期时间的展示方式了。
六月暴雪飞梨花
2023/11/12
3240
技术经验|Java基础之LocalDate类
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
参考 https://blog.csdn.net/duan196_118/article/details/111597682 https://blog.csdn.net/qq_24754061/article/details/95500209 https://xijia.blog.csdn.net/article/details/106007147
时间静止不是简史
2023/02/23
5K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
简单使用时间API(LocalDateTime)
JDK 8中增加了一套全新的日期时间API,这套API设计合理,是线程安全的。新的日期及时间API位于 java.time 包中,下面是一些关键类。
ha_lydms
2023/08/09
4760
Dating Java8系列之新的日期和时间
在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因和未知的设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0开始。这意味着,如果你想要用Date表示Java 8的发布日期,即2014年3月18日,需要创建下面这样的Date实例:
翎野君
2024/01/05
1900
Dating Java8系列之新的日期和时间
Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?
当前时间:2019年10月24日。距离 JDK 14 发布时间(2020年3月17日)还有多少天?
未读代码
2019/11/04
7680
Java 编程问题:三、使用日期和时间
本章包括 20 个涉及日期和时间的问题。这些问题通过Date、Calendar、LocalDate、LocalTime、LocalDateTime、ZoneDateTime、OffsetDateTime、OffsetTime、Instant等涵盖了广泛的主题(转换、格式化、加减、定义时段/持续时间、计算等)。到本章结束时,您将在确定日期和时间方面没有问题,同时符合您的应用的需要。本章介绍的基本问题将非常有助于了解日期-时间 API 的整体情况,并将像拼图中需要拼凑起来的部分一样解决涉及日期和时间的复杂挑战。
ApacheCN_飞龙
2022/07/11
5.7K0
Java8:LocalDate LocalDateTime Date相互转化
时间日期处理是平时工作中使用非常频繁的逻辑,Java8中提供的新的时间类LocalDateTime和LocalDate,使日期处理可以更简单。 友情提醒下,业务开发中最好默认使用LocalDateTime,因为LocalDateTime可以很方便的转换为LocalDate,但是LocalDate是不可以转为LocalDateTime的,会没有时分秒的数据!!!
全栈程序员站长
2022/11/10
1.1K0
Java JDK1.8时间处理
优势:相对于Date、Calendar更加安全而且api更加丰富,对日期时间的操作更加容易,非常值得一试。
收心
2022/08/01
6430
JDK8日期API解析
Date-Time API中的所有类均生成不可变实例,它们是线程安全的,并且这些类 不提供公共构造函数,也就是说没办法通过new的方式直接创建,需要采用工厂方法加以实例化
Java微观世界
2025/01/21
1300
学习Lambda表达式(六):Optional类的使用
Optional是一个没有子类的工具类,Optional是一个可以为null的容器对象,它的主要作用就是为了避免Null检查,防止NullpointerException,
Java鱼头
2022/10/10
8601
JDK8中新的日期时间工具类真的很好用,还不清楚的快进来看看吧,建议收藏
  最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下新的日期时间API。
用户4919348
2021/06/11
1.6K0
JDK8的日期时间操作
查询当前日期(年月日)LocalDate localDate = LocalDate.now();System.out.println(localDate);//2021-11-18查询当前时间(时分秒)LocalTime localTime = LocalTime.now();String format = localTime.format(DateTimeFormatter.ofPattern("HH🇲🇲ss"));System.out.println(localTime.getHour()+":"+l
在下是首席架构师
2022/08/18
9660
JAVA8实战 - 日期API
这一节我们来讲讲JAVA8的日期类,源代码的作者其实就是Joda-Time,所以可以看到很多代码的API和Joda类比较像。日期类一直是一个比较难用的东西,但是JAVA8给日期类提供了一套新的API让日期类更加好用。
阿东
2021/08/16
1.7K0
Java 8: LocalDate、LocalTime 、LocalDateTime 处理日期时间
原文链接:https://blog.csdn.net/weixin_39800144/article/details/78460643、https://blog.csdn.net/ty0903csdn/article/details/84927507
微风-- 轻许--
2019/09/18
3.6K0
为什么建议使用你 LocalDateTime ,而不是 Date?
来源:juejin.im/post/5d7787625188252388753eae
JAVA葵花宝典
2019/10/29
1.2K0
【Java8新特性】06 新的日期和时间:LocalDate LocalTime LocalDateTime
java.util.Date类是Jdk 1.0引入的,易用性非常糟糕,比如年份的起始是1900年,月份的起始是0。比如要表示2019年6月18日,创建一个Date实例:
爱笑的架构师
2020/09/24
1.3K0
【Java8新特性】06 新的日期和时间:LocalDate LocalTime LocalDateTime
jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法
在很久之前,我总结了一些jdk7版本之前的关于时间处理的一些公共方法,日期转换成字符串、指定时间加上指定天数后的日期、获取上周周一时间 等等;具体的可以戳链接查看完整的:https://blog.csdn.net/qq_27471405/article/details/79523556
小小鱼儿小小林
2020/06/24
7.5K0
jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法
Java 8 新特性(三)新的日期时间类
该文介绍了Java 8中新的日期时间类,包括LocalDate、LocalTime、LocalDateTime、ZonedDateTime和Instant,以及它们之间的区别和用法。此外还介绍了如何从数据库中查询日期和时间。
乐百川
2018/01/09
1.5K0
推荐阅读
相关推荐
Java基础学习|学JDK8中的时间类LocalTime
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验