Javaコラム Javaエンジニアのためのお役立ちコラム

Javaのdateを扱った日付を編集する4つのパターンを解説!

2020年11月24日
SE
Javaのdate使用して、どのように日付を編集すればよいのでしょうか。
PM
dateを扱った日付編集のパターンを解説しますので、一緒に見ていきましょう。

Javaのdateを扱った日付を編集する4つのパターン

Javaの日付に関して昔から扱われているのがjava.utilパッケージに備わったDateクラスです。

JavaのDateクラスを使って、日付を編集するのによく扱われるパターンを4つ掲載していきたいと思います。

ただし、Dateクラスの関数では、年、月、日、時、分、秒の値が人間の認識する日付とは違う値となり、そのままでは扱いにくい点もあります。
そのため、Calendarクラス、SimpleDateFormatクラスを併用していきます。

dateの基本

Dateクラスを扱うには、前段で記載したjava.utilパッケージをインポートする必要があります。
インポートクラス:java.util.Date

まず、Dateクラスのオブジェクトを生成してみましょう。
Date date = new Date();
newによりインスタンス化されたdateオブジェクトを扱います。

Dateクラスには年、月、日、時、分、秒を取得するgetメソッドがあります。

getメソッドで取得してみる

試しに、現在の日を取得してみましょう。
先程作成したdateオブジェクトを扱って現在の日を表示させてみます。

コード:System.out.print(date.getDay());
実行結果:2

実行した日は3日だったのですが、結果が2と出ました。

実行した日と結果にズレがあるのは、
Dateクラスが持つフィールドの初期値が0から開始されるためです。
日付というのは1から開始ですが、
Dateから返される値とはズレているので、日付を表示させるには工夫が必要になります。

また、OracleのJava API仕様では非推奨となっており、
Calendarクラスに置き換わっていると説明があります。

日付を編集するためのCalendarクラス

先程のズレに関しては、実行日と結果とで1つズレていますので、
単純に結果を+1すればよいかと考えもしますが、
Dateクラスには加算するメソッドはありません。
なぜなら、Dateクラス自体は経過時間を保持する目的のために存在するからです。

そのため、Dateクラスのオブジェクトを活かすために、
JavaのCalendarクラスとを併用していきます。

Calendarクラスには日付の計算を行うメソッドが用意されています。

dateを扱う① 日付を加算減算する方法

よく扱われる日付の編集方法として加算減算があります。
例として、先程のdateオブジェクトを使ってCalendarクラスと併用し、
現在の日を加算減算してみます。

まず、Javaクラスのインポートから始めます。
import java.util.Date;
import java.util.Calendar;

オブジェクトとインスタンスを生成します。
Date date = new Date();
Calendar cal = Calendar.getInstance();

ここで作成したCalendarインスタンスのcalにdateオブジェクトを設定します。
cal.setTime(date);

このcalインスタンスを使って加算減算を行ってみます。

日付の加算

Calendarクラスの定数を使って現在の日を+1してみます。
1番目の引数に加算したい単位(日、月など)を入れます。
2番目の引数に加算したい値を入れます。
cal.add(Calendar.DATE, 1);

最後に、Calendarインスタンスから時間を取得後、Date型にします。
Date date2 = cal.getTime();

この状態で、date2オブジェクトの中身を表示させます。
System.out.print(date2);
実行結果:Wed Nov 04 23:18:54 JST 2020

実行日は11月3日です。結果はNov 04 と出て11月4日を意味しますので、
1日加算されたことが証明できました。

日付の減算

Calendarクラスの定数を使って日を-2してみます。
先程の日付の加算と同じ要領で1番目、2番目の引数を設定します。
cal.add(Calendar.DATE, -2);

ここも同様にCalendarインスタンスから時間を取得後、Date型にします。
Date date2 = cal.getTime();

この状態で、date2オブジェクトの中身を表示させます。
System.out.print(date2);
実行結果: Sun 01 23:24:46 JST 2020

実行日は11月3日です。結果はSun 01 と出て11月1日を意味しますので、
2日減算されたことが証明できました。

ただし、表示された実行結果は、「2020/11/01」というように
一般的な西暦の表示形式ではないため、フォーマットを変換する必要があります。
変換方法を次項で説明します。

dateを扱う② フォーマットを使った形式化

表示形式を変えるために使用するのは、
Javaのtextパッケージに用意された SimpleDateFormatというクラスです。
このSimpleDateFormatクラスを使って自由に表示形式を作ることが可能です。

まず、Javaクラスのインポートからです。
import java.text.SimpleDateFormat;

次にインスタンスを生成し、形式を設定します。
ここでは「YYYY/MM/DD」の形式にしてみます。
SimpleDateFormat sdf = new SimpleDateFormat(“”yyyy/MM/dd””);

前項で作成した加算のdate2オブジェクトを
formatというメソッドで設定した形式に変換し、表示させてみます。
System.out.println(sdf.format(date2));

実行結果:2020/11/04

先程の実行結果と違って西暦表示となったことがわかります。

dateを扱う③ 日付の比較方法

続いて、日付の比較をご紹介いたします。
Dateクラスにはbefore、after、equalsというメソッドがあります。
これらを使って比較します。結果はboolean(真偽)値で戻ってきます。

・before → 引数よりも過去であればtrue、未来ならfalse
・after → 引数よりも未来であればtrue、過去ならfalse
・equals → 引数と同値ならtrue、違う値ならfalse

例えば、beforeメソッドを使って比較してみます。
まず、先程ご紹介したSimpleDateFormatクラスを扱います。
SimpleDateFormat sdf = new SimpleDateFormat(“”yyyy/MM/dd””);

比較したい日付をparseメソッドで設定します。
Date d1 = sdf.parse(“”2020/11/03″”);
Date d2 = sdf.parse(“”2020/11/04″”);

d1とd2を比較し、結果をresult変数に入れて表示させます。
boolean result = d1.before(d2);
System.out.print(result);

実行結果:true

上記のように、比較結果が真偽値なため分かりやすいです。

dateを扱う④ 日付の差分日数を計算

以前、dateクラスの目的は経過時間の保持ということを記載しましたが、
ミリ秒単位で保持しています。

そのため、日付同士の差分を計算する前に、
まず、保持されたミリ秒を日に直す必要があります。

・ミリ秒から日への換算
long oneDayTime = 1000 * 60 * 60 * 24;
※数値上、long型を用います。

SimpleDateFormatクラスを使い、形式を「YYYY/MM/DD」とします。
SimpleDateFormat sdf = new SimpleDateFormat(“”yyyy/MM/dd””);

差分計算したい日付をparseメソッドで設定します。
Date d1 = sdf.parse(“”2020/11/03″”);
Date d2 = sdf.parse(“”2020/11/04″”);

d1とd2の時間を取得します。
long d1_Time = d1.getTime();
long d2_Time = d2.getTime();

取得したd2とd1を引いた値を、(ミリ秒から日へ)時間換算した単位で割ります。
long oneDayTime = 1000 * 60 * 60 * 24;
long diffDays = (d2_Time – d1_Time) / oneDayTime;

最後にintキャストを使って整数へ変換します。
System.out.print((int)diffDays);

実行結果:1

ポイントは単位の変換です。
そのポイントを抑えていれば問題なく差分計算が行えます。

SE
Javaのdateを扱った日付編集のパターンについて理解できました。
PM
非推奨となっているメソッドに気をつけながら、必要に応じてdateを使い分けていきましょう。

Javaでdateを扱う注意点

最後に注意点を記載します。

JavaのAPI仕様にも述べられてますが、
ここまで何度も説明しましたが、非推奨となっているメソッドが多いです。

そのほとんどはCalendarクラスへ置き換えられているため、併用する必要があります。
ただし、経過時間を取得したい場合には使えます(※取得した値はミリ秒に注意)ので、
必要に応じて使い分けを判断してください。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags