Javaの複雑な日付APIを置き換えるためStephen Colebourne氏を中心に長い間進められているJSR 310は、夏に行われたAPIをシンプルにするためのリファクタリングに続き、Java 8向けの機能一覧が追加された。2013年1月のマイルストーン6で公開される予定だ。
日付の扱いは複雑な問題で、Javaでは紆余曲折を経ている。最初にサポートされたのはjava.util.Dateだが、これは日付というよりも、日時が含まれている名前付きの数値タイムスタンプで、国際化対応はできない。また、例えば、時間は0が基準で月は1が基準、年は1900が基準、というようにプロパティの基準値が揃っていないという問題もある。
1997年、Java 1.1がリリースされた。このバージョンはJDBC経由のSQLをサポートしていた。このバージョンにはjava.util.Dateを継承した日付型が含まれていたが、日付とは違う型だった。さらに、1998年、IBMはjava.util.Calendarを開発した。これは国際化対応をし、柔軟性を持っていたが、比較的単純な使い方をしても複雑になってしまうという難点があった。さらに悪いことにjava.util.Dateとjava.util.Calendarのすべてのプロパティは可変なので、Date型の属性(Time型やTimestamp型)はアクセサから返却されたときに複製しなければならない。
Stephen Colebourne氏が現在幅広く使われているJoda-Timeライブラリをリリースした2005年以降も状況はかわならかった。Joda-Timeによって状況はだいぶ改善したが、外部のライブラリによる改善だった。JSR 310はこのような経験をふまえ、java.util.Dateとjava.util.CalendarをJava SEの標準ライブラリの中で置き換えるようとしている。
310は巨大なAPIだが、筆者が少し使ってみた限りでは一貫性があり簡単に理解できる。最新バージョンではアプリケーションによって使われる高レベルのAPIとフレームワークや直接的にはサポートされていない方法で使う低レベルのAPIを用意して複雑さに対処している。例えば、日付のフィールド(YEAR, MONTH, DAY_OF_MONTH)を拡張したり、"hour-of-fortnight"のような新しいフィールドを追加したりする場合は低レベルのAPIを使う。
高レベルAPIはZonedDateTime(タイムゾーン付きで日時を保持する)、LocalDate、LocalTime、LocalDateTimeのような人が理解しやすい日時や、ログ出力に利用しやすい数値タイムスタンプのInstantなどを提供する。これらのクラスはすべて不変でスレッドセーフだ。
Java 8にJSR 310が含まれるためOpenJDKによってThreeTenプロジェクトが立ち上げられ、統合作業が行われる。310の参照実装を提供するこのプロジェクトはSourceForgeにホストされている。ソースコードはGitHub。
Java 8自体は2013年10月予定。