こんにちは。「Javaを復習する初心者」です。
Calendarオブジェクトに設定されている日付を比較するメソッドCalendar#compareToメソッドを使ってみました。
ミリ秒・日の差を設定
Calendar#compareToメソッドはint型の値を返却します。[カレンダーオブジェクト].compareTo([比較対象のカレンダーオブジェクト])という書き方で、正の数、0、負の数が返却されます。カレンダーオブジェクトの日付が比較対象のカレンダーオブジェクトの日付より前の場合、負の数が返却されます。という風にAPI仕様書にあるのですが、ソースをみると実際には「-1」が返却されるようです。日付が等しい場合は0、日付が後ろの場合1が返却されます。
以下のソースでは実験として、ミリ秒に差を設定して比較、日に差を設定して比較しています。
ソースコード
package calendarTest;
import java.util.Calendar;
public class HelloCompareTo {
public static void main(String[] args) {
test1();
System.out.println();
test2();
}
private static void test1() {
System.out.println("Test1");
Calendar c1 = Calendar.getInstance();
c1.clear();
c1.setTimeInMillis(1451671445321L);
Calendar c2 = Calendar.getInstance();
c2.clear();
c2.setTimeInMillis(1451671445322L);
Calendar c3 = Calendar.getInstance();
c3.clear();
c3.setTimeInMillis(1451671445323L);
System.out.println(
c2.getTimeInMillis() + "と"
+ c1.getTimeInMillis() + "を比較・・・"
+ c2.compareTo(c1));
System.out.println(
c2.getTimeInMillis() + "と"
+ c2.getTimeInMillis() + "を比較・・・"
+ c2.compareTo(c2));
System.out.println(
c2.getTimeInMillis() + "と"
+ c3.getTimeInMillis() + "を比較・・・"
+ c2.compareTo(c3));
}
private static void test2() {
System.out.println("Test2");
Calendar c1 = Calendar.getInstance();
c1.clear();
c1.set(2016, 1 - 1, 2);
Calendar c2 = Calendar.getInstance();
c2.clear();
c2.set(2016, 1 - 1, 3);
Calendar c3 = Calendar.getInstance();
c3.clear();
c3.set(2016, 1 - 1, 4);
System.out.println(
c2.get(Calendar.DATE) + "日と"
+ c1.get(Calendar.DATE) + "日を比較・・・"
+ c2.compareTo(c1));
System.out.println(
c2.get(Calendar.DATE) + "日と"
+ c2.get(Calendar.DATE) + "日を比較・・・"
+ c2.compareTo(c2));
System.out.println(
c2.get(Calendar.DATE) + "日と"
+ c3.get(Calendar.DATE) + "日を比較・・・"
+ c2.compareTo(c3));
}
}
結果
Test1
1451671445322と1451671445321を比較・・・1
1451671445322と1451671445322を比較・・・0
1451671445322と1451671445323を比較・・・-1
Test2
3日と2日を比較・・・1
3日と3日を比較・・・0
3日と4日を比較・・・-1
ミリ秒でもちゃんと比較結果が出ました。ソースを見るとミリ秒を比較している様子なので当然かもしれませんが。
日付の前後判定
if文の条件式でこのメソッドを使う場合があると思います。日付が前または後かを判断するために、不等式を使うことになるとおもいますが、以下のメソッドが用意されてます。
- public boolean before(Object when)
- 「when」より前ならtrue
- public boolean after(Object when)
- 「when」より後ならtrue
以下、beforeだけ試してみました。
ソースコード
package calendarTest;
import java.util.Calendar;
public class HelloBeforAfter {
public static void main(String[] args) {
Calendar c1 = Calendar.getInstance();
c1.clear();
c1.setTimeInMillis(1451671445321L);
Calendar c2 = Calendar.getInstance();
c2.clear();
c2.setTimeInMillis(1451671445322L);
Calendar c3 = Calendar.getInstance();
c3.clear();
c3.setTimeInMillis(1451671445323L);
System.out.println(c2.before(c1));
System.out.println(c2.before(c2));
System.out.println(c2.before(c3));
}
}
結果
false
false
true
日付が同じ場合はfalseを返却してくれます。それにしてもこれらのメソッドは引数がObjectなんですが、何故でしょうか。不思議です。ソースを見ると「instanceof Calendar」を使ってます。最初から引数でCalendarに限定しても良いと思うのですが。