BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java Time API,Java 8で提供

Java Time API,Java 8で提供

ブックマーク

原文(投稿日:2013/02/08)へのリンク

 

ThreeTenが JSR 310 Date and Time API のリファレンス実装として,JDK 8 Early Access b75 に含まれることになった。このJava Time API for JDK 8がパッケージjava.timeとなり,従来の実装であるjavax.timeは削除される。Java Time Javadoc のドラフト版も公開されている。

Java Time のクラスはすべて,不変(immutable)かつスレッドセーフだ。実装としては 予期的グレゴリオ歴 (Proleptic Gregorian Rules) に準拠した事実上の世界カレンダであるISO 8601カレンダシステムに基づく。そ例外のカレンダシステムのサポートは,java.time.calendar および java.time.temporal パッケージが提供する。日付と時刻を扱うクラスに加えて,APIには時刻,期間と周期,月や曜日を表す列挙型なども含まれている。

Java Time APIには数多くのクラスがあるが,大部分のアプリケーションが最初に使用するのは,次のような日付/時刻データ型だろう。

Instant
ナノ秒の単位を記録するタイムスタンプ値。System.currentTimeMills() のように,ある時点をキャプチャするには便利だ。Instantはjava.util.Dateに相当するクラスで,印字形式では '2000-12-01T12:30:00.000Z' のように表現される。
LocalDate
時間やオフセット,タイムゾーンを持たない日付データ。誕生日を記録するような目的に使用する。印字形式は '2000-12-01' のようになる。
LocalTime
日付やオフセット,タイムゾーンを持たない時刻データ。例えば店舗の営業時間を表すために使用する。印字形式は '12:30:00.000' のようになる。
LocalDateTime
オフセットとタイムゾーンを持たない日付時刻データ。印字形式は '2000-12-01T12:30:00.00' のようになる。
ZonedDateTime
オフセットとタイムゾーンを持った日付時刻データ。'America/New_York' など,タイムゾーンを考慮した計算を行うには便利である。ZonedDateTimeはjava.util.GregorianCalendarに相当するクラスで,印字形式では '2000-12-01T12:30:00.000-05:00[America/New_York]' のようになる。

ドメインをモデル化するときには,LocalDateやLocalTime,LocalDateTimeといった,タイムゾーンを持たないシンプルなクラスを可能な限り使用するように推奨されている。アプリケーション全体でタイムゾーンを処理すれば,相当に煩雑な処理が増えることになるからだ。ほとんどのアプリケーションでは,もっとシンプルなクラスで間に合うだろう。タイムゾーンはユーザインターフェース層でのみ扱えばよい。

Java Time APIで他に注目すべきクラスとしては,次のようなものがある。

Clock
タイムゾーンを含んだ現在日付と時刻にアクセスするためのクロック。System.currentTimeMills() や TimeZone.getDefault() に代えて使用することができる。主要な日付および時刻関連のクラスはすべてnow()という,システムクロックを使用するファクトリメソッドを持っている。それにも関わらずこの抽象クラスが用意されているのは,システムクロックとは別のクロックをインジェクションするためだ。これにより,テストを大幅に簡素化することができる。
Duration
タイムライン上の2点の間隔を,ナノ秒の分解能で格納する。このクラスは時間間隔をモデル化したもので,特定の時刻には結び付けられてはいない。このモデルには方向性があり,負の値を持つこともある。印字時の形式は 'PT3600S' のようになる。
Period
'1年,2ヶ月,3日' のように,人にとって意味のある単位で表現された期間。このモデルには方向性があり,項目ごとに負の値を持つこともある。印字形式は 'P1Y2M3D' のようになる。
ZoneId
タイムゾーンIDを America/New_York のように表す。
ZoneOffset
グリニッジ標準時からのオフセットを +02:00 のように表す。

java.time.zone パッケージはタイムゾーン,つまりその地方のタイムラインにおけるルールや,サマータイムなどに起因するギャップ,あるいはオーバーラップといったものをサポートする。日付や時刻オブジェクトの書式化と解析を行う java.time.format パッケージも用意されているが,ほとんどの用途には各クラスの toString() と parse() メソッドで十分だろう。java.time.tempotal パッケージは,フィールド名と単位を指定した日付および時刻へのアクセス,日付の重要部分を表現する補足的な値クラス,デフォルトであるISO以外のカレンダシステムに関する基本サポートに加えて,より高度なユースケースに関する追加的機能も提供する。

新しいJDK 8 Time APIを使うには,JDK 8b75をダウンロードした上で,javadocをガイドにするとよいだろう。JDK 8をIDE上で使用したいならば,最新のIntelliJ JDEAかNetbeans IDEが利用可能である。なおAPIは,この数年間に数多くの変更が加えられている。サードパーティのチュートリアルを探しているならば,最新の記事を参照する必要がある。Java Time APIのクラスやメソッドに関しては,JDK 8のリリースまで引き続き変更される可能性があることにも注意が必要だ。JDK 8に含まれるすべての機能と,それがいつ実装されるのかを知りたいのならば,JDK機能リストチェンジセット を見ておくとよいだろう。

InfoQでは2007年初頭の JSR 310の発表 の頃から,この話題を取り上げている。当初このJSRは,JDK 7とともに公開される計画だった。また2010年のJSR初期ドラフトレビュー時には,JSR 310のリーダである {1}Stephen COlebourne氏のインタビュー{/1} も伝えている。JSR 310に関して InfoQが前回取り上げた のは,2012年9月,Java 8の機能リストに公式に加えられた時のことだ。

 

この記事に星をつける

おすすめ度
スタイル

BT