DateUtils

Commons Lang3のクラスで、DateやCalendar周りの日付操作ユーティリティ。

DateやCalendarは基礎的な操作は提供するが、年月日のみの比較というような 実際によく行われる処理についてはない。DateUtilsはそこを補う。

Date And Time APIが登場しているので、1からDate関連のユーティリティを作るのは気が引ける。DateUtilsに必要な物があれば利用したい。

isSameDay() - 年月日のイコールが判定できる

Date型のequals()はミリ秒まで一致しなければtrueにならない。 よって年月日のみ同じかどうか調べる場合は、年と月と日をそれぞれ取り出して比較しなくてはいけない。そんなときは、このDateUtils.isSameDay()で一発。

DateUtils.isSameDay()の例
//比較のためsecondDateは1ミリ秒をずらしておく
long currentTimeMillis = System.currentTimeMillis();
Date firstDate = new Date(currentTimeMillis);
Date secondDate = new Date(currentTimeMillis + 1);

//ミリ秒が一致しないのでfalse
boolean isEqual = firstDate.equals(secondDate);

//(ミリ秒が一致しないが)年月日が同じなのでtrue
boolean isSameDay = DateUtils.isSameDay(firstDate, secondDate);

truncate() - 不要な範囲をばっさりを切り捨てる

Date型はミリ秒まで扱うが年月日のみ扱いたい場合もある。こういった場合、時分秒などは0に設定しておきたいが面倒な作業である。 そんなときは1つ1つ設定するのではなく、truncateで範囲を指定してばっさり切る(0にする)。

DateUtils.isSameDay()の例
Calendar cal = new GregorianCalendar(2002, 2, 28, 13, 45);

//日より下が切り捨てられるので「2002年3月28日0時0分0秒」となる
Date truncated = DateUtils.truncate(cal.getTime(), Calendar.DATE);

addDays(),setDays() - Calendarのフィールド定数とさよならする

add()やset()はCalendarで提供されているが、フィールドに関する定数値を指定しなければならない。これをCalendarクラスの膨大な定数の中から選ぶのがたいへんで、間違えたフィールドを選んでしまっても同じint型なので コンパイルエラーにはならない。

DateUtilsではこれらのフィールドに関する操作をメソッドで提供してる。また、Date型で受け取ってくれるので いちいちCalendar型に変換する必要もない。

Calendarを用いた日付操作
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE,1);
DateUtilsを用いた日付操作
Date date = new Date();
DateUtils.addDays(date, 1);