Javaで日時を比較する際に、時間は除外して日付のみを比較したかった。
"2018/04/06 12:15:27" と "2018/04/06 20:47:55" を比較して同じ日かのみを(時間は除外して)判定したかったのでメモ。
なんかすごく泥臭いやり方のような気がするけど、元がタイムスタンプでもDateクラスでもとりあえずCalendarクラスのインスタンス化し、時分秒ミリ秒に0をセットして、CalendarクラスのcompareTo()メソッドで比較するだけです。
なんかもっとスマートなやり方無いのでしょうか(Java初心者の小言)
// 適当な日時のタイムスタンプから00:00:00:000のCalendarインスタンス作成
int oneDayTimeStamp = 1523017440;
Calendar oneDayCal = Calendar.getInstance();
oneDayCal.setTimeInMillis(oneDayTimeStamp * 1000L);
// 時分秒ミリ秒に0をセット
oneDayCal.set(Calendar.HOUR_OF_DAY, 0);
oneDayCal.set(Calendar.MINUTE, 0);
oneDayCal.set(Calendar.SECOND, 0);
oneDayCal.set(Calendar.MILLISECOND, 0);
// 現在日時の00:00:00:000のCalendarインスタンス作成
Calendar now = Calendar.getInstance();
// 時分秒ミリ秒に0をセット
now.set(Calendar.HOUR_OF_DAY, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
if (oneDayCal.compareTo(now) == 0) {
// 0だと日付が同じ
}
@swordone さんにコメント頂きまして、こちらが断然スマートです!
public int compareByDate (Calendar c1, Calendar c2) {
int result = c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
return (result != 0) ? result : c1.get(Calendar.DAY_OF_YEAR)- c2.get(Calendar.DAY_OF_YEAR);
}
@Luice さんからのコメント頂いた方法です。ライブラリを追加する必要がありますが、truncatedCompareToメソッドだけで済みます。truncatedCompareToメソッドが中でやっているのは、時分秒ミリ秒を0にするのtruncateメソッドを実行して、その後にCalendarオブジェクトからタイムスタンプを取得して比較しています。
AndroidのAPIとしてtruncatedCompareToメソッドが元々あって欲しいな〜と思ったり。(Kotlinはどうなんだろう)
// commons-lang3-3.7.jarをlibsフォルダにいれてbuild.gradleに以下記述を追加
compile files('libs/commons-lang3-3.7.jar')
// Calendar : c1, Calendar : c2
if (DateUtils.truncatedCompareTo(c1, c2, Calendar.HOUR_OF_DAY) == 0) {
// 0だと日付が同じ
}