こんにちは!フリーランスの桃太郎です。
Javaには日付の処理を行うCalendarクラスがあります。
この記事では、基本的な、
・Calendarクラスとは
・Calendarクラスの使い方
という基本的な内容から、
・setメソッドで日付を設定する方法
・addメソッドで日付の計算をする
・Date⇔Calendarの変換方法
などの応用的な使い方に関しても解説していきます。
Calendarクラスについて正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
JavaのCalendar基本編
Calendarクラスとは
Calendarクラスとは、特定の日付や指定した年・月・日・時などの操作を行うためのクラスです。
日付というキーワードからよく比較対象としてあげられるDateクラスとの違いについては以下の記事を参考にしてみると良いでしょう。
getinstanceでオブジェクト生成
Calendarクラスは演算子newではなく、 getInstanceメソッドを呼ぶことにより、オブジェクトを生成します。
Calendar cl = Calendar.getInstance();
getInstanceメソッドは、呼び出すごとに現在の日付と時間に初期化された状態で、オブジェクトを返します。
Calendarクラスは、日付の演算や取得、日付同士の比較など、日付操作で必要なさまざまなメソッドが用意されています。
使用するにはimport java.util.Calendarを指定します。
使い方
以下に、Calendarクラスの基本的な使い方を記述します。
import java.util.Calendar; public class Main { public static void main(String[] args) throws Exception { //Calendarクラスのオブジェクトを生成する Calendar cl = Calendar.getInstance(); System.out.println("YEAR:" + cl.get(Calendar.YEAR)); System.out.println("MONTH:" + cl.get(Calendar.MONTH)); System.out.println("DATE:" + cl.get(Calendar.DATE)); } }
実行結果
YEAR:2017 MONTH:2 DATE:27
サンプルでは、Calendarクラスのオブジェクトを生成し、getメソッドで現在の年月日をそれぞれ取得しています。
注意点として、CalendarクラスやDateクラスは月またぎの問題があり、0が1月となります。そのため、現在は2017年3月ですが、月が2と出力されてしまいます。
紛らわしさを回避する方法としては、以下のように記述すれば、月が3で出力されます。
int month = cl.get(Calendar.MONTH) + 1; System.out.println("MONTH:" + month);
実行結果
MONTH:3
Calendarの基本メソッドの使い方
ここからはCalendarクラスでよく利用されるメソッドについて紹介していきます。
setメソッドで日付を設定する方法
まずはCalendarクラスのsetメソッドの基本的な使い方を解説します。
setメソッドは日時を設定するために使用し、日付を処理するプログラムにおいて頻繁に使用されるメソッドの一つです。
setメソッドの使い方のサンプルは以下の通りです。
import java.util.Calendar; public class Main { public static void main(String[] args) throws Exception { /* setの基本的な使い方 */ Calendar cl = Calendar.getInstance(); System.out.println("現在日時:" + cl.getTime().toString()); // 年に2018年を設定する cl.set(Calendar.YEAR, 2018); System.out.println("年に2018年を設定:" + cl.getTime()); // 月に10月を設定する *月の指定は0から始まるため、10月は'9"を指定する cl.set(Calendar.MONTH, 9); System.out.println("月に10月を設定:" + cl.getTime()); // 日に5日を設定する cl.set(Calendar.DATE, 5); System.out.println("日に5日を設定:" + cl.getTime()); // 年月日をまとめて設定する cl.set(2020,3,7); System.out.println("2020年4月7日に設定:" + cl.getTime()); // 年月日時分秒までをまとめて設定する cl.set(2020,3,7,11,10,59); System.out.println("2020年4月7日11時10分59秒に設定:" + cl.getTime()); } }
実行結果
現在日時:Mon Jul 17 10:43:58 UTC 2017 年に2018年を設定:Tue Jul 17 10:43:58 UTC 2018 月に10月を設定:Wed Oct 17 10:43:58 UTC 2018 日に5日を設定:Fri Oct 05 10:43:58 UTC 2018 2020年4月7日に設定:Tue Apr 07 10:43:58 UTC 2020 2020年4月7日11時10分59秒に設定:Tue Apr 07 11:10:59 UTC 2020
setメソッドの機能で1点気をつけることがあります。
上記のサンプルをよく見ていただくと、現在日付から年、月、日と個別に設定している箇所では、指定した要素(年や月や日)以外は前の値を保ったままになっています。
このことは日付の加算減算処理などで想定した日付と違う不具合に遭遇した際に、解決のヒントになることがよくありますので初心者の方は覚えておいて下さい。
setメソッドの使い方は、以下の記事で詳しく解説しています!
addメソッドで日付の計算をする
Calendarクラスで、日付の加算減算などを行いたい場合は、addメソッドを使用します。
addメソッドの使い方は、以下の記事で詳しく解説しています!
formatメソッドで日付の形式を指定
Calendarクラスは、文字列で日付のフォーマットを設定することが可能です。
日付のフォーマットの設定方法は、以下の記事で詳しく解説しています!
日付が正しいか確認する方法
設定した日付が正しい日付か判断する場合は、CalendarクラスのsetLenientメソッドを使用します。
通常Calendarクラスは日付の整合性チェックを行わないため、存在しない日付を指定して、演算処理などを行った場合、日付の範囲が不正であることによる例外が発生してしまいます。
そのため、演算処理などの前に日付の整合性をチェックするためのメソッドとしてsetLenientメソッドを使用します。
以下にsetLenientメソッドを使用した日付チェック処理を記述します。
import java.util.Calendar; public class Main { public static void main(String[] args) throws Exception { Calendar cl = Calendar.getInstance(); //setLenientメソッドでfalseを設定 cl.setLenient(false); cl.set(2017, 3, 40); try{ cl.getTime(); } catch (Exception ex){ System.out.println("日付が存在しない"); } } }
実行結果
日付が存在しない
サンプルでは、CalendarクラスのオブジェクトにsetLenientメソッドで引数に、falseを指定しています。
falseを指定することで、日付の妥当性のチェックが行われ、存在しない日付2017/3/40を指定するとgetTimeメソッドで日付取得時に、例外が投げられます。
Date⇔Calendarの変換方法
CalendarからDateに変換
ここでは、CalendarからDateに変換する方法を解説します。
Calendar型からDate型へ変換する場合は、Calendar型の変数に対して、getTimeメソッドで現在時刻を取得し、Date型の変数に設定すれば変換できます。
次のプログラムで確認してみましょう。
import java.util.Calendar; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { // CalendarクラスからDateクラスに変換 Calendar cl = Calendar.getInstance(); Date date = new Date(); date = cl.getTime(); System.out.println(date); } }
実行結果:
Mon Mar 27 00:11:03 UTC 2017
DateからCalendarに変換
ここでは、DateからCalendarに変換する方法を解説します。
Date型からCalendar型へ変換する場合は、日時を設定するsetTimeメソッドを使用します。
setTimeの引数にDate型の変数を指定すれば、Calendar型へ変換することができます。
次のプログラムで確認してみましょう。
import java.util.Calendar; import java.util.Date; public class Main { public static void main(String[] args) throws Exception { //DateクラスからCalendarクラスに変換 Date date = new Date(); Calendar cl = Calendar.getInstance(); cl.setTime(date); System.out.println(cl.getTime().toString()); } }
実行結果:
Mon Mar 27 00:16:24 UTC 2017
Calendarについてもっと詳しく知りたい方へ
Calendarのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここではCalendarクラスの基本的な使い方や、setメソッドにて日付を設定する方法、フォーマットを指定する方法などの実践的な使い方について紹介しました。
Calendarクラスでは特にsetメソッドで日付を設定する方法はよく使われるので初心者の方はなんども繰り返し読んで覚えて下さいね。
日付を扱う場面は数多く存在し、しかもその扱い方に悩まされることが多々あると思います。
そのような時はぜひこの記事をブックマークしていただき、日付の実装について悩んだ時はこの記事を思い出してくださいね!