前回は、Date and Time APIのベースとなる、日付と時刻の表記に関する国際規格である「ISO 8601」について紹介しました。今回からは、Date and Time APIを解説していきます。

 まず、Date and Time APIの概要を説明します。その後、Date and Time APIで、最も使用頻度が高い日付/時刻を表すクラスを紹介していきます。

Date and Time APIの概要

 Date and Time APIは、以下のような特徴を持ったAPIです。

  • ISO 8601がベース
  • 多様な時間表現を表すクラス群
  • イミュタブル(immutable)
  • 多様な日時演算
  • 和暦、ヒジュラ暦などのサポート
  • 高い拡張性

 既存のjava.util.Dateクラス、java.util.Calendarクラスは日時を表せます。しかし、日付だけで十分な場合でも、日付だけを表すクラスがないためDateクラスまたはCalendarクラスを使用する必要がありました。また、時間長を表すクラスは提供されていないため、「1年間」や「3カ月」などの表現を行うことができませんでした。

 これに対し、Date and Time APIでは日付用のクラス、時刻用のクラス、日時用のクラスと用途に応じて様々なクラスを提供しています。また、時間長を表すクラスも用意されています。

 イミュタブルはDate and Time APIの大きな特徴の一つです。

 Date/Calendarクラスはイミュタブルではないため、マルチスレッドのシステムで扱う場合、細心の注意が必要でした。これに対して、Date and Time APIのクラス群はイミュタブルなので、スレッドセーフです。したがって、マルチスレッドのシステムでも容易に使用することが可能です。

 ただし、クラスがイミュタブルであるため、日時の演算を行った場合でも状態は変更されないことに注意が必要です。演算処理を行った場合、結果は返り値のオブジェクトで表されます。

 様々な日時に関する演算処理も、Date and Time APIでは提供しています。日時の加算、減算だけでなく、時間長に対する乗算、除算なども提供しています。

 Date and Time APIでは様々な処理を提供しており、メソッドも多くあります。これらのメソッドは、以下に示す接頭語によって、処理をある程度特定できます。

  • of
    staticファクトリメソッド
  • parse
    文字列からのパース処理
  • format
    フォーマットを指定した文字列への変換処理
  • get
    オブジェクトが保持している値の取得
  • is
    booleanを返すチェック用の処理
  • with
    指定した値を設定したオブジェクトを返す処理。セッターの代わりに使用する
  • plus
    加算処理
  • minus
    減算処理
  • to
    他の形式に変換する処理
  • at
    他のオブジェクトと結合したオブジェクトを返す処理

 既存のCalendarクラスでもグレゴリオ暦、和暦、タイ仏暦をサポートしていましたが、パブリックなクラスはグレゴリオ暦(GregorianCalendarクラス)だけでした。これに対し、Date and Time APIでは和暦はもちろん、タイ仏暦、ヒジュラ暦(イスラム暦)、民国暦を提供しています。

 また、これは拡張性にも関係してきますが、標準で提供している暦以外の暦を作成することも容易になっています。

 このような特徴を持つDate and Time APIですが、java.timeパッケージと4つのサブパッケージで提供されています。javaパッケージの直下に新しいパッケージができたのは久しぶりです。J2SE 1.4で追加されたNIOのjava.nioパッケージ以来ではないでしょうか。