前述のようにDate-Time APIでは簡単に日時の加算や減算ができるように、加算のためのplusメソッドと減算のためのminusメソッドが用意されています。また、特定の属性を変更するwithメソッドもあります。このwithメソッドの中には、例えば来週の日曜日のような、数値による変更ではなく、特定の日付を指定して変更するメソッドも用意されています。
そして、Date-Time APIのクラスはImmutableなクラスなので、加算や減算をしても元のインスタンスの値が変わることはなく、新たに加算もしくは減算されたインスタンスが生成されることになります。
それでは、Date-Time APIに用意されている、それらのメソッドについて見ていきましょう。
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メソッドなどがあります。
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メソッド名の後に属性の名称が付いていて、その属性に対して値を設定するメソッドも用意されています。例えば、次のサンプルでは、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.