Java 8:了解新特性——新的 Date API

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

嗨,亲爱的读者!欢迎阅读我关于 Java 8 新特性的系列文章。在本系列的最后一篇博文中,我们讨论了用于日期和时间操作的新库,它的灵感来自 Joda Time 库。

因此,事不宜迟,让我们开始使用此功能吧!

在 Java 上操作日期和时间

Java 社区一直抱怨用于操作日期的 Java API 有他的问题,比如限制、难以使用等。考虑到这一点,Java 8 带来了一个新的 API,它带来了简单性和强大的方式我们在 Java 上使用日期时间。让我们从学习如何创建新类的实例开始。

要创建一个新的 Date 实例(没有时间),表示当前日期,我们所要做的就是:


 LocalDate date = LocalDate.now();

要创建一个新的 Time 实例,基于创建实例的时间,我们这样做:


 LocalDate date = LocalDate.now();

最后,要创建一个日期时间,换句话说,一个日期和时间表示,我们使用这个:


 LocalDate date = LocalDate.now();

上面的实例没有时区信息,仅使用本地时区。如果需要使用特定时区,我们创建了一个名为 ZonedDateTime 的类。 为了 例如,如果我们想从我们的时区创建一个实例并将它们更改为 Sidney 的时区,我们可以这样做:


 LocalDate date = LocalDate.now();

上面的代码在我的位置打印以下内容:


 LocalDate date = LocalDate.now();

实例化此类的另一种方法是针对预定义的日期和/或时间。我们可以这样做:


 LocalDate date = LocalDate.now();

使用所有这些类,添加和/或删除日期、月或年到日期或时间对象的时间对象非常简单。下面的代码说明了这种简单性:


 LocalDate date = LocalDate.now();

运行上面的代码,它打印:


 LocalDate date = LocalDate.now();

需要注意的一件重要事情是,在所有方法中,我们都必须“捕获”操作的返回。这样做的原因是,与我们使用的旧类(如 Calendar 类)相反,新日期 API 上的实例是不可变的,因此它们总是返回一个新值。这对于并发访问的场景很有用,因为实例不会携带状态。

另一个简单之处在于我们从日期或时间获取值的方式。在过去,当我们想从 Calendar 中获取年份或月份时,例如,我们需要使用通用的 get 方法,并指示我们想要的字段,如 Calendar.YEAR 。使用新的 API,我们可以轻松地使用特定方法,如下所示:


 LocalDate date = LocalDate.now();

运行上面的代码后,将产生以下结果:


 LocalDate date = LocalDate.now();

另一件简单的事情是将日期与 API 进行比较。如果我们编写以下代码:


 LocalDate date = LocalDate.now();

在上面的代码中,正如预期的那样,只有第一个 print 会打印 true

新 API 的一个有趣特性是语言环境支持。例如,在下面的代码中,我们用不同的语言打印日期的月份:


 LocalDate date = LocalDate.now();

运行上面的代码,在我当前的日期,我们将得到以下结果:


 LocalDate date = LocalDate.now();

使用新 API 格式化日期也是一项简单的任务。如果我们想将日期格式化为“dd/MM/yyyy”格式,我们所要做的就是传递一个具有所需格式的 DateTimeFormatter


 LocalDate date = LocalDate.now();

我们不时遇到的一个非常常见的需求是需要计算两个日期之间的时间。使用新的 API,我们可以使用 ChronoUnit 类非常轻松地进行计算:


 LocalDate date = LocalDate.now();

在我今天(08/06/2015),上面的代码产生了:


 LocalDate date = LocalDate.now();

需要注意的一件事是,如果我们对交换的对象使用相同的方法,我们将收到负数。如果我们的逻辑需要计算始终为正,我们可以使用类 Period Duration 来计算日期之间的时间,它们具有方法 isNegative() negated() 来产生这种期望的效果。

我们将访问的新 API 的最后一个特性是无效日期的概念。当我们使用 Calendar 时,如果我们尝试输入 2 月 30 日的日期,在该月变为 28 天的年份, Calendar 会将日期调整为 3 月 2 日,换句话说,它会超过日期输入,没有抛出任何错误。这并不总是期望的效果,因为有时这会导致不可预测的行为。在新 API 上,如果我们尝试执行以下操作:


 LocalDate date = LocalDate.now();

我们将收到一个无效日期异常,确保以更简单的方式处理此类错误:


 LocalDate date = LocalDate.now();

参考

这个系列的灵感来自出版商“Casa do Código”的一本书,这本书是我在学习中使用的。不幸的是,这本书是用葡萄牙语写的,但对于想要快速了解 Java 8 新特性的开发人员来说,它是一个很好的资源:

Java 8 实践

结论

我们关于 Java 8 新特性的系列到此结束。当然,还有其他主题我们没有谈到,比如 PermGen 的终结,它被另一种称为元空间的内存技术所取代。如果读者想了解更多, 这篇文章 在这个主题上非常有趣。但是,通过本系列,读者可以为开始在 Java 8 上进行开发打下良好的基础。

在像 Java 这样的编程语言上,时常发生变化是很正常的。对于一个已经存在了这么多年的语言,令人印象深刻的是 Java 仍然能够不断发展,反映出更现代语言的新趋势。 Java会永远这样下去吗?只有时间会给出答案....

感谢您在另一个帖子上关注我,直到下一次。

Joda-Time 官方网站

源代码(Github)