Calendarで久々にはまる

Javaで日付を比較するために時刻部分を0にしようとすることは多いだろう。
久々にぽかをかましてしまった。ぱっと見で間違いに気づきにくいのが厄介だ。

Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);


だが、これでは動くときと動かないときがあるのだ。

午前中に比較すると成功して、午後に比較するとダメ。「Calendar.HOUR」は午前と午後を利用する12時間対応型なのだ。つまり、午前中に動かすと想定どおりに動くが午後だと24時間表記で12時にされるため、動かない。

したがって24時間で比較したいときには以下のようにする。
now.set(Calendar.HOUR_OF_DAY, 0);

久々にあほらしいことで悩んでしまった。


個人的には日付のみをあらわすDate、時刻のみを表すTime、日付と時刻を表すDateTimeと分かれていないのがJavaの日付の扱いにくさの原因だと思ってる。また、Java5対応していないために、定数が型チェックされないとかいろいろと。

Formatterは日本語対応してないし。月の文字列が省略形と詳細と丁寧にあるとか0から始まるとかは、やはりJava英語圏のためのものというあたりがよくわかる。日本だと数字として扱うからね。でもしっかり日本語対応されてjaロケールだと睦月、如月、弥生と表示されてもこまるかな。