Java SE 8发行版中引入的Date-Time包java.time提供了全面的日期和时间模型,是在JSR 310:Date and Time API下开发的,尽管java.time
基于国际标准化组织(ISO)日历系统,但也支持经常使用的全球日历。html
此课程介绍了使用基于ISO的类来表示日期和时间以及操做日期和时间值的基本原理。java
时间彷佛是一个简单的主题,即使是便宜的手表也能提供合理准确的日期和时间,可是,经过仔细研究,你会发现微妙的复杂性和许多影响你理解时间的因素。例如,在1月31日添加一个月的结果对于闰年而言与其余年份不一样,时区也增长了复杂性,例如,一个国家可能会在短期内进出夏令时,或者一年屡次进入夏令时,或者可能在某一年内彻底跳过夏令时。数据库
Date-Time API使用ISO-8601中定义的日历系统做为默认日历,此日历基于公历系统,并在全球范围内用做表示日期和时间的事实标准。Date-Time API中的核心类有LocalDateTime
、ZonedDateTime
和OffsetDateTime
等,全部这些都使用ISO日历系统。若是你想使用其余日历系统,例如Hijrah或Thai Buddhist,java.time.chrono
包容许你使用其中一个预约义的日历系统,或者你能够建立本身的。segmentfault
Date-Time API使用Unicode公共语言环境数据存储库(CLDR),这个存储库支持全世界的语言,并包含全世界最大的可用语言环境数据集合,此存储库中的信息已本地化为数百种语言。Date-Time API还使用时区数据库(TZDB),该数据库提供了自1970年以来全球每一个时区变化的信息,以及自引入该概念以来的主要时区的历史记录。api
Date-Time API是使用几个设计原则开发的。安全
API中的方法定义明确,其行为清晰且预期,例如,使用null
参数值调用Date-Time方法一般会触发NullPointerException
。oracle
Date-Time API提供了流畅的接口,使代码易于阅读,由于大多数方法不容许具备null
值的参数而且不返回null
值,因此能够将方法调用连接在一块儿,而且能够快速理解生成的代码,例如:框架
LocalDate today = LocalDate.now(); LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
Date-Time API中的大多数类建立的对象不可变,这意味着在建立对象后,它不能被修改,要更改不可变对象的值,必须将新对象构造为原始对象的修改副本。这也意味着根据定义,Date-Time API是线程安全的。这会影响API,由于用于建立日期或时间对象的大多数方法都以for
、from
或with
做为前缀,而不是构造函数,而且没有set
方法,例如:函数
LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14); LocalDate firstBirthday = dateOfBirth.plusYears(1);
Date-Time API尽量是可扩展的,例如,你能够定义本身的时间调整器和查询,或构建本身的日历系统。线程
Date-Time API由主包java.time
和四个子包组成:
java.time
java.time.chrono
java.time.format
java.time.temporal
TemporalField
和ChronoField
)和单元(TemporalUnit
和ChronoUnit
)在此包中定义。java.time.zone
ZonedDateTime
、ZoneId
或ZoneOffset
。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 |
实例 | 将此对象与另外一个对象组合。 |