JSR 310 是一个用于执行与时间和日历有关的计算的 API,已经得到 Java SE 7 的推荐。该 API 的 目标是取代现有的两个构成 Java 的当前日期和时间 API 的类:java.util.Date 和 java.util.Calendar,同时仍然提供对这些旧有 API 的向后兼容访问。JSR 当前正在开发,并且该 API 有一个可用的试验性 Javadoc。
对 Java 6 日期/时间 API 的改进
JSR 310 日期/时间 API 试图通过提供更好的性能和易用性改进 Java 的当前日期/时间 API。例如, Java Calendar 类将日期同时存储为与标准纪元之间的偏移量(以毫秒为单位)以及一组日历字段(例如 ,星期几、几号以及月份)。此双精度表示导致在意外的时间重新计算日历字段,从而产生不可预测的性 能特点。与此相比,JSR 310 类仅将日期/时间表示存储为与 Date 和 Calendar 所使用的同一标准纪元 之间的偏移量(以毫秒为单位);仅当需要时才会计算日期等日历字段,并且不会使用这些日历字段进行 内部日期表示。
JSR 310 还对当前 Java 日期/时间模型进行了改进。Java 6 API 不包含表示本地时间(不具有关联 时区的时间)、持续时间或时间间隔的类。这迫使程序员使用令人困惑的设计做法,例如使用 int 表示 持续时间。JSR 310 包含表示上述各个概念的类,从而可以进行更为明确的程序设计。
最后,JSR 310 API 通过使用不可改变的类努力实现线程安全。Java 当前的日期/时间类 Date 和 Calendar 都是可改变的,因而都不是线程安全的。
JSR 310 日期/时间概念
JSR 310 API 利用了从多个第三方 Java 日期/时间 API 中获得的经验。JSR 310 主要基于 Joda Time API;其他影响因素包括 ICU、Time and Money 和 Calendar Date。JSR 310 的 API 是围绕 Joda Time 中使用的相同 5 个基本日期/时间概念构建的:
离散的时间线
瞬间
不完全时间
持续时间
时段
时间间隔
离散的时间线
像 Joda Time 一样,JSR 310 使用离散化的时间线:时间被建模为由小的固定持续时间分隔的连续的 瞬间序列。JSR 310 的离散时间线具有纳秒分辨率,因此可以表示时间“2008 年 1 月 1 日午夜后 1 纳 秒”,但不能表示时间“2008 年 1 月 1 日午夜后 1 皮秒”。该时间线上的每个离散纳秒都被视为一个 瞬间,如下所示。