本文已参与「新人创作礼」活动,一起开启掘金创作之路。
What's JSR?
JSR是Java Specification Requests的缩写, 意思是Java规范提案. 指的是向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求. 任何人都可以向JCP请求JSR, 以向Java平台增添新的API和服务. JSR已成为Java界的一个重要标准.
What's JSR 310?
JSR 310 是一个关于Date-Time相关的API的提案, 其目的在于为Java提供一种新的经过改善的Date-Time API. 由Stephen Colebourne提出并完善, 在Java SE 8中首次引入, 核心类位于java.time.*包中.
JSR 310提供了几个核心概念:
- Instant: 瞬间, 代表了一个确定的时间点, 其值为相对于标准Java纪元(1970.1.1)的偏移量, 精度为ns/纳秒. 其类似于
java.util.Date, 但精度为ms/毫秒. - LocalDate/LocalTime/LocalDateTime: 代表了人类自身的观念, 要么是日期, 要么是时间, 要么是日期跟时间.
- Period/Duration: 表示日期/时间的间隔, 两者的区别在于表示的时间粒度不同.
Period#between(LocalDate, LocalDate)表示日期之间的间隔, 可以通过Period#getYears()/getMonths()/getDays()来获取对应日期单位的值.- 而
Duration#between(Temporal, Temporal)表示两个Instant之间的时间间隔, 可以通过Duration#toDays()/toHours()/toMinutes()/toMillis()/toNanos()来获取对应时间单位的值.
JSR-310和Joda-Time都是由Stephen Colebourne提出并开发的, 两者API相似度很高.
What's ThreeTen
ThreeTen 意指310, 是一个专门开发并维护JSR 310的组织. 表示JSR-310后向移植.
What's ThreeTen-Backport?
ThreeTen-Backport是Java SE 8日期时间API向Java SE 6&7的后向移植.
这个后向移植不是JSR-310的具体实现, 因为这将要求跳过大量不必要的障碍. 正相反, 这只是简单的后向移植, 目的在于允许用户迅速地在Java SE 6&7上使用JSR-310 API. 后向移植使用ThreeTen这个名字. 该移植是Java 8 日期时间库的首席作者Stephen Colebourne来策划.
What features do ThreeTen-Backport have?
后台移植库的特性与Java SE 8的JSR-310特性相匹配:
- 日期和时间类型
- 格式化
- 候选日历系统
- 通用实用程序
ThreeTen-ExtraAPI尽可能匹配Java SE 8的API. 接口的默认方法和静态方法, 在移植程序中通过抽象类进行模拟. 此外, 静态常量用于模拟方法引用, 比如, 使用LocalDate.FROM而非LocalDate::from.
ThreeTen-Backport的最新发布版本为 1.6.0 , 该版本在生产中稳定且好用.
该项目运行于 Java SE 6 (或者更高)且无依赖.
已知存在问题: Hijrah日历系统不可用. 格式化和解析经常依赖于只在Java SE 8上可用的数据. Zone id解析和文本解析效率差很多.
What's ThreeTenABP?
ThreeTenABP是一个开源项目, 由大神jakewharton开发. 项目全称 ThreeTen Android Backport, 是Java端ThreeTen-Backport在Android平台的适配.
How to use ThreeTenABP in Android?
使用非常的简洁:
只需要在Application#onCreate()中初始化时区信息即可:
@Override public void onCreate() {
super.onCreate();
AndroidThreeTen.init(this);
}
这跟Android中使用ThreeTenBP一模一样.
ThreeTenABP vs ThreeTenBP vs Joda-Time
ThreeTenBP和Joda-Time在Android上使用有相似的问题, 即使用jar资源来加载时间信息. 这在Android中是极其低效的机制.
而ThreeTenABP则将时区信息放在Android的asset文件夹下, 并提供了自定义加载器来进行高效解析.
此外, Joda-Time拥有非常大量的API, 这将给Android应用带来巨大的体积和方法数目上的增加. JSR-310和Joda-Time的创造者也说尽管Joda-Time挺好, 但它确实存在设计缺陷.
因而, 对于新项目推荐使用ThreeTenABP, 它与Java SE 8有相同的API, 且包体积更小. 若是项目中已经使用了Joda-Time, 除非包体积和方法数目十分敏感, 否则也不推荐切换到ThreeTenABP.