Java 8 Time - 时间管理大师
整体分析
java.time包结构分析
- time:父级基础包,常用的时间相关类都在这里,如LocalDate\LocalDateTime\Instant等
- chrono:日历系统包,日历相关的接口(类似Calendar)也包括提供对其他日历系统的API
- format:格式化和解析包,主要类是DateTimeFormatter
- temporal:扩展功能包,提供细粒度的时间控制field、unit,如weeks、months、month-of-year等
- zone:时区包,时区规则、本地时区等
chrono包
LocalDate、LocalTime、LocalDateTime都实现了Chrono包中对应ChronoLocalDate、ChronoLocalTime、ChronoLocalDateTime。世界上现有的日历系统也有很多种,the Japanese, Minguo, Thai Buddhist and others.而Chrono包则封装了一个Chronology
temporal包
TemporalAdjuster 接口是时间调整器,执行日常环境常见的日期操作,例如,可以获得当月的最后一天、下一年的第一天。
TemporalAccessor 接口主要是时间访问器,子类可以实现之后提供TemporalField和TemporalQuery相关的信息
zone包
这个包主要提供时区相关接口和类,需要注意的是ZoneRules接口,这个是提供同一个地区某段时间使用的时区规则集合,具体可以参考
迄今为止最硬核的「Java8时间系统」设计原理与使用方法.
这篇文章写的很细致,推荐。
常用静态方法字义对应
- from 静态方法 依据传入的TemporalAccessor对象创建实例
- now 静态方法 依据系统时钟创建Temporal对象
- of 静态方法 其他时间对象,或者详细的年月日等创建对象
- parse 静态方法 由字符串创建Temporal对象的实例
- atOffset 将Temporal对象和某个时区偏移相结合
- atZone 将Temporal 对象和某个时区相结合
- format 使用某个指定的格式将Temporal对象转换为字符串(Instant类不提供此方法)
- get 读取Temporal对象的某一部分的值
- minus 将当前的Temporal对象的值减去一定的时长,并创建新对象
- plus 将当前Temporal对象的值加上一定的时长,并创建新对象
- with 调整当前对象部分时间熟悉,并创建新对象。
- is 判断与其他时间对象的先后关系等
新旧方法对比图
总结
这个包的整体设计和代码实现也都是教科书级,我本来是想整理一个API的常用使用,但是发现对整个包的结构和相关设计都不清晰。想着摸索了解作者的设计思路,然后用自己的语言讲解,提升自己的理解,然而越看越发现自己知识欠缺,大到什么是时间,怎么统一表示时间,如果针对时间建立领域模型,小到如何调整时间,都有所不知。希望能够Stay hungry! stay foolish!
参考资料
链接: Java SE 8 Date and Time.
链接: Java 8 (11) 新的日期和时间API.
链接: 迄今为止最硬核的「Java8时间系统」设计原理与使用方法.
链接: java8新特性之time深度解析.