JavaではDateクラスを使うことで簡単に日付の取得や変更を行うことが出来ます。
別の記事でFileクラスについての説明もしていますが、このDateクラスも開発ということにおいては必要不可欠な要素でありプログラミングの基礎でもあります。
学習中の方の中には漠然とは理解しているけど具体的な理解には至っていないという方もいるかもしれませんので、今回の記事でより深い理解に繋がれば嬉しいです。
Dateクラスとは
そもそもDateクラスとは何型のクラスか?という部分ですが、日付型というクラスです。
簡単に言い換えると、日付を扱う上で使用する全てのメソッドはこのDateクラスに揃っています。
他クラスのインスタンスとの違いは、Dateインスタンスは生成した時点でクラスオブジェクトに現在の日付が返されることであり、Dateクラスを使うためにインポートするものも「java.util.Date」のみと至ってシンプルです。
Dateクラスオブジェクトの記述ルールは次のようになっています。
Date 変数名 = new Date();
基本的な使い方
まずは基本的な使い方から見てみましょう。
次のコードではオブジェクトを生成し、現在の日付を出力する方法が記述してあります。
import java.util.Date; public class dateClass{ public static void main(String[] args) throws Exception { Date date = new Date(); System.out.println(date); } }
実行結果
Wed Sep 11 22:40:31 JST 2019
このコードではDateクラスオブジェクトを生成してそのまま出力しています。
上の説明で触れたように何もせずダイレクトに出力させるだけでコンパイル時の日付が返ってきているのが分かります。
ただしこのままではあまり使い道がないことも事実ですので、次はこのデータを成形していくための方法を紹介します。
フォーマットを指定する
先ほどDateクラスでコンパイル時の日付を出力しました。今回はこのデータを基にSimpleDateFormatクラスを使って成形してみます。
次のコードを見てください。
import java.util.Date; import java.text.SimpleDateFormat; public class testClass{ public static void main(String[] args) throws Exception { // (1)Dateオブジェクトを生成 Date date = new Date(); // (2)SimpleDateFormatクラスを使用してフォーマットを成形 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); try { // (3)フォーマットに沿ってDateオブジェクトを表示 System.out.println(sdf.format(date)); } catch(Exception e) { System.out.println(e); } } }
まず(1)でDateオブジェクトを生成しています。
続いて(2)でSimpleDateFormatクラスを生成、引数にフォーマットパターンを記述します。
最後に(3)でformatメソッドを使い(2)で指定したフォーマットパターンに沿って出力させています。
なおSimpleDateFormatクラスを使うためには次のパッケージをインポートする必要が有ります。
import java.text.SimpleDateFormat;
日付のチェック
SimpleDateFormatクラスはフォーマットパターンで存在しないパターンを設定すると”IllegalArgumentException”の例外が発生しますが、日付の設定に存在しない日付を設定しても例外が発生しません。
設定した日付が正しいかどうかのチェックをするためには、日付設定前にsetLenientメソッドを使用する必要が有ります。setLenientメソッドの記述は以下の通りです。
このとき引数には「false」を設定してください。
SimpleDateFormat.setLenient(false);
次のコードは実際にsetLenientメソッドを使用した記述方法です。
import java.text.ParseException; import java.text.SimpleDateFormat; public class testClass{ public static void main(String[] args) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); sdf.setLenient(false); try { sdf.parse("2019/13/40"); System.out.println("true"); } catch(ParseException e) { System.out.println("false"); } } }
実行結果
false
このコードではsdf.parseで「2019/13/40」と実際にはあり得ない日付を設定したため、実行結果としてfalseを吐き出しています。
setLenientメソッドにfalseを指定しておくことで、このように日付の妥当性を検証することが出来ます。
Calendarクラス
Dateクラスと似たクラスとしてもう一つ覚えておいた方が良いクラスがあります。それがCalendarクラスです。
Dateクラスの主な使用目的が値の取得であるのに対し、Calendarクラスの主な使用目的は日付や時刻の演算処理であり、値を計算する場合に使用します。したがってこの二つのクラスは似て非なるもの(=Calendarクラスは値の取得が出来ないという事ではないので注意してください)と言えます。
Calendarクラスを使うためには次のパッケージをインポートする必要が有ります。
import java.util.Calendar;
またCalendarクラスオブジェクトの記述ルールは次のようになっています。
Calendar 変数名 = Calendar.getInstance();
getInstanceメソッドは、オブジェクト生成の度に現在の日付に初期化された状態でオブジェクトを返します。
基本的な使い方
それではまずCalendarクラスの基本的な使い方から見てみましょう。
次のコードを見てください。
import java.util.Calendar; public class testClass{ public static void main(String[] args) throws Exception { Calendar calendar = Calendar.getInstance(); System.out.println("年:" + calendar.get(Calendar.YEAR)); System.out.println("月:" + calendar.get(Calendar.MONTH)); System.out.println("日:" + calendar.get(Calendar.DATE)); } }
このコードではCalendarクラスのgetメソッドを使用することで、それぞれのフォーマットに対応した値を取得しています。
ここでは絶対に忘れてはいけない注意点が一つあります。DateクラスとCalendarクラスには「月またぎ問題」と呼ばれる問題があり、1月が「0」になります。
したがって実際の月の計算には日付を出力させる前に以下の1行を付け加える必要が有ります。
int month = calendar.get(Calendar.MONTH) + 1;
これを踏まえ、再度現在の年月日を表示させるコードを記述すると以下のようになります。
import java.util.Calendar; public class testClass{ public static void main(String[] args) throws Exception { Calendar calendar = Calendar.getInstance(); // 月またぎ問題の修正 int month = calendar.get(Calendar.MONTH) + 1; System.out.println("年:" + calendar.get(Calendar.YEAR)); System.out.println("月:" + month); System.out.println("日:" + calendar.get(Calendar.DATE)); } }
日付を設定する
日付や時間といった要素を指定した値に設定したい場合にはCalendarクラスのsetメソッドを使用します。
CalendarクラスではYEAR、MONTH、DATE、HOUR、MINUTEなどの定数が予め用意されています。
setメソッドの第一フィールドにはこれらの定数を、第二フィールドには値を指定することが出来ます。
public void set(int field, int value)
次のコードではsetメソッドの基本的な使用方法を紹介します。
import java.util.Calendar; public class testClass{ public static void main(String[] args) throws Exception { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2019); System.out.println(calendar.getTime()); } }
実行結果
Thu Sep 12 04:18:22 JST 2019
このコードではsetメソッドの第一フィールドにCalendarクラスの定数であるYEARを指定、第二フィールドには2019という値を指定していますが、第二フィールドに過去の日付も指定することも可能です。
加算/減算などの演算処理
Calendarクラスオブジェクトが保持している日付に対し、指定した値で演算処理をしたい場合にはaddメソッドを使用します。
記述ルールは次の通りです。
public void add(int field, int value)
setメソッドと同じく、第一フィールドには定数を、第二フィールドには値を入れることが出来ます。
では実際のコードを見てみましょう。
import java.util.Calendar; public class testClass{ public static void main(String[] args) throws Exception { // Calendarクラスインスタンスの生成 Calendar calendar = Calendar.getInstance(); //1年加算する calendar.add(Calendar.YEAR, 1); System.out.println("年:" + calendar.getTime()); //1ヶ月加算する calendar.add(Calendar.MONTH, 1); System.out.println("年:" + calendar.getTime()); //1日加算する calendar.add(Calendar.DAY_OF_MONTH, 1); System.out.println("年:" + calendar.getTime()); //1年減算する calendar.add(Calendar.YEAR, -1); System.out.println("年:" + calendar.getTime()); } }
実行結果
年:Sat Sep 12 05:11:13 JST 2020 年:Mon Oct 12 05:11:13 JST 2020 年:Tue Oct 13 05:11:13 JST 2020 年:Sun Oct 13 05:11:13 JST 2019
まとめ
今回はDateクラスとCalendarクラスについて説明してみました。
プログラミングをしていると日付を扱う機会が非常に多いことに気づくはずです。プログラミングの中でも基本部分ではありますが、それだけに色々な方法が確立されており構築方法も様々ですので、これを機にしっかりと学習しておきましょう。