連載
» 2015年01月29日 18時00分 公開

Java 8日時APIの主なメソッドとフォーマット用のパターン文字の使い方ここが大変だよJava 8 Date-Time API(2)(3/6 ページ)

[長谷川智之,株式会社ビーブレイクシステムズ]

日付や時刻の計算や変更を行うメソッドの使い方

 前述のようにDate-Time APIでは簡単に日時の加算や減算ができるように、加算のためのplusメソッドと減算のためのminusメソッドが用意されています。また、特定の属性を変更するwithメソッドもあります。このwithメソッドの中には、例えば来週の日曜日のような、数値による変更ではなく、特定の日付を指定して変更するメソッドも用意されています。

 そして、Date-Time APIのクラスはImmutableなクラスなので、加算や減算をしても元のインスタンスの値が変わることはなく、新たに加算もしくは減算されたインスタンスが生成されることになります。

 それでは、Date-Time APIに用意されている、それらのメソッドについて見ていきましょう。

ChronoUnitとTemporalUnitを使って加算や減算を行う

 Date-Time APIのクラスには、そのクラスが持つ年月日や時分秒などのそれぞれの単位に対して加算や減算を行うためのメソッドが用意されています。

 加算を行うためには「plus」メソッド、減算を行うためには「minus」メソッドを使います。それらのメソッドの引数として、加算や減算をする値と、年や月など計算を行う単位を渡すことで対象の属性に対して計算を行います。

 この計算の単位として渡す引数はTemporalUnitインターフェースになります。Date-Time APIではすでに、このTemporalUnitを実装したChronoUnitの列挙型が用意されています。ChronoUnitの列挙型の主なものは次のものがあります。

列挙型 概要
YEARS 年を表す単位
MONTHS 月を表す単位
WEEKS 週を表す単位
DAYS 日を表す単位
HOURS 時を表す単位
MINUTES 分を表す単位
SECONDS 秒を表す単位
MILLIS ミリ秒を表す単位
NANOS ナノ秒を表す単位

 この他にも、いろいろなChronoUnitの列挙型が用意されています。興味ある方はChronoUnitのJavaDocをご参照ください。

 このChronoUnitを使って加算や減算を行う場合、第1引数に加算もしくは減算する値、第2引数に単位を表すChronoUnitを渡します。例えば、2014年2月28日に1日加算する場合は次のようになります。

LocalDate localDate = LocalDate.of(2014, 2, 28);
LocalDate result = localDate.plus(1, ChronoUnit.DAYS);
System.out.println(result);
2014-03-01
実行結果

 また、引数にChronoUnitが必要ない、plusもしくはminusの後に単位の名称が付いた、メソッドも用意されています。それらのメソッドはその特定の単位に対して加算もしくは減算を行います。例えば、日数を加算するためのplusDaysメソッドなどがあります。

ChronoUnitを使って特定の属性を変更する

 Date-Time APIのインスタンスから特定の属性を変えた別のインスタンスを取得したり、呼び出し元のインスタンスから翌週の日曜のような特定の日付が指定されたインスタンスを生成したりするメソッドに「with」メソッドがあります。withメソッドにはplusメソッドやminusメソッドと同じように、引数として設定する属性の指定と値を受け取るメソッドと、withの後に対象の属性の名称が付いていて値のみを渡すメソッドがあります。

 引数に属性の指定と値を渡すメソッドの場合、属性として使うものはTemporalFieldインターフェースになります。このTemporalFieldにも、このインターフェースを実装したChronoFieldの列挙型がDate-Time APIには用意されています。用意されている主なChronoFieldの列挙型は次のものになります。

列挙型 概要
YEAR 年を表す属性。
MONTH_OF_YEAR 月を表す属性。この列挙型を指定する場合は1〜12までの値を設定できる
DAY_OF_WEEK 週を表す属性。この列挙型を指定する場合は1(月曜日)〜7(日曜日)までの値を設定できる
DAY_OF_MONTH その月の日を表す属性。この列挙型を指定する場合は1からその月が持つ最終日まで設定できる。例えば1月の場合は、1日から31日までになる
DAY_OF_YEAR その年の日を表す属性。この列挙型を指定する場合は1からその年が持つ最終日までです。うるう年でない場合は1〜365まで、うるう年の場合は1〜366まで指定できる
HOUR_OF_DAY 時を表す属性。この列挙型を指定する場合は0〜23まで設定できる
MINUTE_OF_HOUR 分を表す属性。この列挙型を指定する場合は0〜59まで設定できる
SECOND_OF_MINUTE 秒を表す属性。この列挙型を指定する場合は0〜59まで設定できる
MILLI_OF_SECOND 1000分の1秒を表す属性。この列挙型を指定する場合は0〜999まで設定できる
NANO_OF_SECOND 10億分の1秒を表す属性。この列挙型を指定する場合は0〜9億9999万9999まで設定できる

 この他にもChronoFieldには、いろいろな列挙型が用意されています。興味ある方はJavaDocをご参照ください。

 そして、このwithメソッドでは第1引数に単位を表すChronoField、第2引数に設定する値を渡します。例えば、LocalTimeのインスタンスから属性にMILLI_OF_SECONDと10億分の1を表すNANO_OF_SCONDを、値に1を設定したwithメソッドを実行した場合、次のようになります。

LocalTime now =LocalTime.now(); 
System.out.println(now);
System.out.println(now.with(ChronoField.MILLI_OF_SECOND,1));
System.out.println(now.with(ChronoField.NANO_OF_SECOND,1));
22:17:11.598
22:17:11.001
22:17:11.000000001
実行結果

withメソッド名の後に属性の名称が付いていて、その属性に対して値を設定するメソッド

 また、withメソッド名の後に属性の名称が付いていて、その属性に対して値を設定するメソッドも用意されています。例えば、次のサンプルでは、withDayOfMonthメソッドを使って、2014年5月9日のインスタンスから日の属性に15を設定した新たなインスタンスを生成しています。

LocalDate localDate = LocalDate.of(2014, 5, 9);
LocalDate result = localDate.withDayOfMonth(15);
System.out.println(result);
サンプル
2014-05-15
実行結果

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。