Date And Time APIとは

Java8より導入されたDate And Time APIの概要。いままでのDateとCalendarとの違いとは。

執筆時バージョン
Java

Java SE 8

Java8よりDate And Time APIが導入された。いままでのDateとCalendarとはベースの部分から大幅に変更されているので、全く新しいものが加わったともいえる。

JSR310として仕様策定が進められてきたもので、そのスペックリードはJoda-Timeの作者。よってJoda-Timeの影響も多く受けている。(コピーということでもない)

ISO8601をベースとした新しい日時API

この点が既存のDateとCalendarとの一番の違い。Date And Time APIはISO8601をモデリングしたものであるともいえる。よってISO8601は避けて通れないし、(少しでもいいので)学んでおくのが近道。

ISO8601は日付と時刻の表記に関する国際規格。2000年代以降はよく使われていて、XMLSchemaなどもこれ。一方いままでのDateとCalendarは、UNIX時刻をベースにしている。これまでの日付APIを刷新するという強い意志があったと思われるが、大幅な変更となった。

ISO8601は普及してきているので、この形式をベースにすること自体は自然。なぜいままでのDateとCalendarはUNIX時刻であるのかは、当時の普及ぐあいによるところが大きい。java.util.DateクラスはJDK1.0から存在している。そのときは1990年代中盤でISO8601はまだ仕様が完全には出来上がっていなかったし、UNIX時刻が一般的だった。よってDateとCalendarがUNIX時刻を採用していたのも、当時として考えると自然。

ただベースの部分が違うので互換性がない。これまでの資産を入れ替えるというよりか、今後作成するプログラムで使っていくことになる。

互換性はないが変換は可能

前述のとおりDate And Time APIといままでのDateとCalendarはベースが違うため、直接的な互換性がない。DateやCalendarが直接対応できるクラスが、Date And Time APIにはない。

ただそれではさすが困ってしまうので、Instantクラスを介した変換の道は存在する。

日時APIとして大幅な改善

ISO8601がベースになって点も大きいが、実際にプログラミングするにあたってはこちらの改善がうれしい。

  • イミュータブル/スレッドセーフ

  • 多様な日時クラスと演算メソッド

イミュータブル/スレッドセーフ

Date And Time APIのクラスは基本イミュータブルなので、CalendarのようにsetTimeで時間を変えることはしない(できない)。このイミュータブルであることがスレッドセーフであることにつながる。

多様な日時クラスと演算メソッド

これまでは日付を表したいだけなのにjava.util.Dateを使わざる得なかった。これからは日付であれば「LocalDate」が使える。これで明示的に日付を表していることがわかるし、型としても安全で使えるメソッドも制限される。java.util.Dateは「Date」といいながら「日付」「時間」を表現していたので、何を表しているのかわかりづらかった。

演算メソッドも大幅に改善された。各クラスで操作できる内容が異なるため統一されたインタフェースはないが、統一されたメソッドの接頭辞で操作内容を簡単に想像できるようになっている。

Appendix B: 改訂履歴

  • v1.0, 2016-07-05: 初稿