Calendarクラスの落とし穴?


Calendarクラス、便利ですよね。
Androidアプリで日時を扱うときには必須のクラスですが、ググッてもあまり出てこない情報があります。
それは「ミリ秒の設定」についてです。

例えば、Calendarクラスの日時を「2001年2月3日 4時56分」に設定するとします。
すると、たいていのサイトでは

Calendar calendar = Calendar.getInstance();
calendar.set(2001, 1, 3, 4, 56, 0);

と解説してあると思います。

また、一方で、2つの異なるCalendarクラスを比較して、どちらが未来かを判別する場合は、こう書かれています。

int different = calendar1.compareTo(calendar2);

これで、differentが0になれば同じ日時、正の値になればcalendar1の方が未来、負の値になればcalendar2の方が未来ということになります。

では、試しにこのコードを実行してみてください。

Calendar calendar1 = Calendar.getInstance();
calendar1.set(2001, 1, 3, 4, 56, 0);

Calendar calendar2 = Calendar.getInstance();
calendar2.set(2001, 1, 3, 4, 56, 0);

int different = calendar1.compareTo(calendar2);

calendar1も、calendar2も、同じく「2001年2月3日 4時56分」に設定しました。
しかし、differentに返ってきた結果は0ではないはず。おそらく、「calendar2の方が未来」という結果になったかと思います。

それは、ミリ秒の設定を行っていないからです。
Calendarクラスにミリ秒を設定を設定するには以下のようにします。

Calendar calendar1 = Calendar.getInstance();
calendar1.set(2001, 1, 3, 4, 56, 0);
calendar1.set(Calendar.MILLISECOND,0);

Calendar calendar2 = Calendar.getInstance();
calendar2.set(2001, 1, 3, 4, 56, 0);
calendar2.set(Calendar.MILLISECOND,0);

int different = calendar1.compareTo(calendar2);

これで、はじめてdifferentが0なります。
Calendarクラスを利用して日時比較をする際は、この点に気を付けてください!

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください