资讯专栏INFORMATION COLUMN

Java™ 教程(Date-Time)

AlphaGooo / 589人阅读

Date-Time

Java SE 8发行版中引入的Date-Time包java.time提供了全面的日期和时间模型,是在JSR 310:Date and Time API下开发的,尽管java.time基于国际标准化组织(ISO)日历系统,但也支持常用的全球日历。

此课程介绍了使用基于ISO的类来表示日期和时间以及操作日期和时间值的基本原理。

概述

时间似乎是一个简单的主题,即便是便宜的手表也能提供合理准确的日期和时间,但是,通过仔细研究,你会发现微妙的复杂性和许多影响你理解时间的因素。例如,在1月31日添加一个月的结果对于闰年而言与其他年份不同,时区也增加了复杂性,例如,一个国家可能会在短时间内进出夏令时,或者一年多次进入夏令时,或者可能在某一年内完全跳过夏令时。

Date-Time API使用ISO-8601中定义的日历系统作为默认日历,此日历基于公历系统,并在全球范围内用作表示日期和时间的事实标准。Date-Time API中的核心类有LocalDateTimeZonedDateTimeOffsetDateTime等,所有这些都使用ISO日历系统。如果你想使用其他日历系统,例如Hijrah或Thai Buddhist,java.time.chrono包允许你使用其中一个预定义的日历系统,或者你可以创建自己的。

Date-Time API使用Unicode公共语言环境数据存储库(CLDR),这个存储库支持全世界的语言,并包含全世界最大的可用语言环境数据集合,此存储库中的信息已本地化为数百种语言。Date-Time API还使用时区数据库(TZDB),该数据库提供了自1970年以来全球每个时区变化的信息,以及自引入该概念以来的主要时区的历史记录。

Date-Time设计原则

Date-Time API是使用几个设计原则开发的。

明确

API中的方法定义明确,其行为清晰且预期,例如,使用null参数值调用Date-Time方法通常会触发NullPointerException

流畅

Date-Time API提供了流畅的接口,使代码易于阅读,因为大多数方法不允许具有null值的参数并且不返回null值,所以可以将方法调用链接在一起,并且可以快速理解生成的代码,例如:

LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
不可变

Date-Time API中的大多数类创建的对象不可变,这意味着在创建对象后,它不能被修改,要更改不可变对象的值,必须将新对象构造为原始对象的修改副本。这也意味着根据定义,Date-Time API是线程安全的。这会影响API,因为用于创建日期或时间对象的大多数方法都以forfromwith作为前缀,而不是构造函数,并且没有set方法,例如:

LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);
可扩展

Date-Time API尽可能是可扩展的,例如,你可以定义自己的时间调整器和查询,或构建自己的日历系统。

Date-Time包

Date-Time API由主包java.time和四个子包组成:

java.time

用于表示日期和时间的核心API,它包括日期、时间、日期和时间组合、时区、时刻,持续时间和时钟的类,这些类基于ISO-8601中定义的日历系统,并且是不可变的和线程安全的。

java.time.chrono

用于表示除默认ISO-8601之外的日历系统的API,你还可以定义自己的日历系统,本教程未详细介绍此包。

java.time.format

用于格式化和解析日期和时间的类。

java.time.temporal

扩展API,主要用于编写框架和库,允许日期和时间类之间的互操作、查询和调整,字段(TemporalFieldChronoField)和单元(TemporalUnitChronoUnit)在此包中定义。

java.time.zone

支持时区、时区偏移和时区规则的类,如果使用时区,大多数开发人员只需要使用ZonedDateTimeZoneIdZoneOffset

方法命名约定

Date-Time API在一组丰富的类中提供了一组丰富的方法,尽可能在类之间使方法名一致,例如,许多类提供了一个now方法,用于捕获与该类相关的当前时刻的日期或时间值,from方法允许从一个类转换到另一个类。

关于方法名称前缀也有标准化,由于Date-Time API中的大多数类都是不可变的,因此API不包含set方法(创建后,无法更改不可变对象的值,set方法的不可变等价是with),下表列出了常用的前缀:

前缀 方法类型 使用
of 静态工厂 创建一个实例,其中工厂主要验证输入参数,而不是转换它们。
from 静态工厂 将输入参数转换为目标类的实例,这可能涉及从输入中丢失信息。
parse 静态工厂 解析输入字符串以生成目标类的实例。
format 实例 使用指定的格式化程序来格式化时间对象中的值以生成字符串。
get 实例 返回目标对象状态的一部分。
is 实例 查询目标对象的状态。
with 实例 返回更改了一个元素的目标对象的副本;
这是JavaBean上set方法的不可变等价物。
plus 实例 返回添加时间量的目标对象的副本。
minus 实例 返回减去时间量的目标对象的副本。
to 实例 将此对象转换为另一种类型。
at 实例 将此对象与另一个对象组合。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73084.html

相关文章

  • Java教程(目录)

    Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...

    lifesimple 评论0 收藏0
  • Java8的新特性

    摘要:语言特性系列的新特性的新特性的新特性的新特性的新特性的新特性的新特性的新特性的新特性序本文主要讲的新特性,也是一个重要的版本,在语法层面有更大的改动,支持了表达式,影响堪比的泛型支持。 Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13...

    xi4oh4o 评论0 收藏0
  • 乐字节-Java8新特性之Date API

    摘要:上一篇文章,小乐给大家带来了新特性之,接下来本文将会给大家介绍新特性之前言通过发布新的来进一步加强对日期与时间的处理。 上一篇文章,小乐给大家带来了Java8新特性之Optional,接下来本文将会给大家介绍Java8新特性之Date API 前言: Java 8通过发布新的Date-Time API来进一步加强对日期与时间的处理。 旧版的 Java 中,日期时间 API 存在诸多问题...

    suemi 评论0 收藏0
  • JavaScript 中基于 swagger-decorator 的自动实体类构建与 Swagger

    摘要:中基于的自动实体类构建与接口文档生成是笔者对于开源项目的描述,对于不反感使用注解的项目中利用添加合适的实体类或者接口类注解,从而实现支持嵌套地实体类校验与生成等模型生成基于的接口文档生成等等功能。 JavaScript 中基于 swagger-decorator 的自动实体类构建与 Swagger 接口文档生成是笔者对于开源项目 swagger-decorator 的描述,对于不反感使...

    Gemini 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<