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

- システム
エンジニア - Javaのdate使用して、どのように日付を編集すればよいのでしょうか。
- プロジェクト
マネージャー - 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
ポイントは単位の変換です。
そのポイントを抑えていれば問題なく差分計算が行えます。
- システム
エンジニア - Javaのdateを扱った日付編集のパターンについて理解できました。
- プロジェクト
マネージャー - 非推奨となっているメソッドに気をつけながら、必要に応じてdateを使い分けていきましょう。
Javaでdateを扱う注意点
最後に注意点を記載します。
JavaのAPI仕様にも述べられてますが、
ここまで何度も説明しましたが、非推奨となっているメソッドが多いです。
そのほとんどはCalendarクラスへ置き換えられているため、併用する必要があります。
ただし、経過時間を取得したい場合には使えます(※取得した値はミリ秒に注意)ので、
必要に応じて使い分けを判断してください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)